From e0dc755ee3a4b5bc79c60fcbfbf89612d4907b38 Mon Sep 17 00:00:00 2001 From: liuminghui <468701464@qq.com> Date: Fri, 6 Nov 2026 17:28:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=90=E5=8D=95=E8=B4=B9?= =?UTF-8?q?=E7=94=A8=E5=92=8C=E8=B4=B9=E7=94=A8=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../price/SrvBillAirController.java | 39 ++ .../price/airbill/domain/SrvBillAirFee.java | 40 ++ .../airbill/domain/SrvBillAirFeeLog.java | 64 +++ .../airbill/domain/SrvBillAirFeeSave.java | 20 + .../bms/price/mapper/SrvBillAirFeeMapper.java | 28 ++ .../price/service/ISrvBillAirFeeService.java | 19 + .../impl/SrvBillAirFeeServiceImpl.java | 382 ++++++++++++++++++ .../mapper/price/SrvBillAirFeeMapper.xml | 76 ++++ bms-back/sql/price/air_bill_menu.sql | 21 + .../sql/price/pay_bill_segment_amount.sql | 49 +++ bms-front/src/api/price/airBill.js | 27 ++ bms-front/src/views/price/billing/airBill.vue | 10 +- .../billing/components/AirBillFeeDialog.vue | 341 ++++++++++++++++ 13 files changed, 1115 insertions(+), 1 deletion(-) create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFee.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeLog.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeSave.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/mapper/SrvBillAirFeeMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/service/ISrvBillAirFeeService.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/service/impl/SrvBillAirFeeServiceImpl.java create mode 100644 bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirFeeMapper.xml create mode 100644 bms-back/sql/price/pay_bill_segment_amount.sql create mode 100644 bms-front/src/views/price/billing/components/AirBillFeeDialog.vue diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/SrvBillAirController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/SrvBillAirController.java index 503111b6..9b3d2977 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/SrvBillAirController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/SrvBillAirController.java @@ -1,18 +1,26 @@ package com.bms.web.controller.price; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.bms.common.annotation.Log; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; import com.bms.common.core.page.TableDataInfo; +import com.bms.common.enums.BusinessType; import com.bms.common.utils.StringUtils; +import com.bms.price.airbill.domain.SrvBillAirFeeLog; +import com.bms.price.airbill.domain.SrvBillAirFeeSave; import com.bms.price.domain.vo.SrvBillAirQuery; import com.bms.price.domain.vo.SrvBillAirVo; +import com.bms.price.service.ISrvBillAirFeeService; import com.bms.price.service.ISrvBillAirService; /** @@ -25,6 +33,9 @@ public class SrvBillAirController extends BaseController @Autowired private ISrvBillAirService srvBillAirService; + @Autowired + private ISrvBillAirFeeService srvBillAirFeeService; + /** * 提单列表 */ @@ -55,4 +66,32 @@ public class SrvBillAirController extends BaseController } return success(vo); } + + /** 一票提单下未删除的费用 */ + @PreAuthorize("@ss.hasPermi('price:airBill:fee')") + @GetMapping("/fee/list") + public AjaxResult feeList(@RequestParam("billCode") String billCode) + { + return success(srvBillAirFeeService.listFees(billCode)); + } + + /** 提单费用的新增、修改、删除日志,按页返回 */ + @PreAuthorize("@ss.hasPermi('price:airBill:fee')") + @GetMapping("/fee/log") + public TableDataInfo feeLog(@RequestParam("billCode") String billCode) + { + List list = srvBillAirFeeService.listLogs(billCode); + TableDataInfo table = getDataTable(list); + table.setRows(new ArrayList<>(list)); + return table; + } + + /** 只保存本次新增、修改、删除的费用,并写入提单日志 */ + @PreAuthorize("@ss.hasPermi('price:airBill:fee')") + @Log(title = "提单费用", businessType = BusinessType.UPDATE) + @PostMapping("/fee/save") + public AjaxResult saveFee(@RequestBody SrvBillAirFeeSave command) + { + return success(srvBillAirFeeService.save(command)); + } } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFee.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFee.java new file mode 100644 index 00000000..4b59b770 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFee.java @@ -0,0 +1,40 @@ +package com.bms.price.airbill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 空运提单费用明细 srv_bill_air_fee。 + */ +@Data +public class SrvBillAirFee +{ + private Long id; + + private String billCode; + + /** 字典 bms_fee_type */ + private String feeType; + + private BigDecimal price; + + /** 字典 bms_currency */ + private String currency; + + private String remark; + + private String createBy; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + private String updateBy; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + /** 0未删除 1已删除 */ + private String delFlag; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeLog.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeLog.java new file mode 100644 index 00000000..9525a3ba --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeLog.java @@ -0,0 +1,64 @@ +package com.bms.price.airbill.domain; + +import java.util.Date; +import java.util.List; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 空运提单费用操作日志。 + */ +@Data +public class SrvBillAirFeeLog +{ + public static final String INSERT = "1"; + + public static final String UPDATE = "2"; + + public static final String DELETE = "3"; + + private Long logId; + + private String billCode; + + private Long feeId; + + private String operationType; + + private String summary; + + private String changeContent; + + private String createBy; + + private String createByName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + private List changes; + + @Data + public static class FieldChange + { + private String field; + + private String fieldLabel; + + private String oldValue; + + private String newValue; + + public FieldChange() + { + } + + public FieldChange(String field, String fieldLabel, String oldValue, String newValue) + { + this.field = field; + this.fieldLabel = fieldLabel; + this.oldValue = oldValue; + this.newValue = newValue; + } + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeSave.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeSave.java new file mode 100644 index 00000000..daaad8b6 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFeeSave.java @@ -0,0 +1,20 @@ +package com.bms.price.airbill.domain; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; + +/** + * 保存提单费用时只带有变动的行。未出现的费用保持原样。 + */ +@Data +public class SrvBillAirFeeSave +{ + private String billCode; + + private List inserts = new ArrayList<>(); + + private List updates = new ArrayList<>(); + + private List deletes = new ArrayList<>(); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/SrvBillAirFeeMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/SrvBillAirFeeMapper.java new file mode 100644 index 00000000..68325483 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/SrvBillAirFeeMapper.java @@ -0,0 +1,28 @@ +package com.bms.price.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bms.price.airbill.domain.SrvBillAirFee; +import com.bms.price.airbill.domain.SrvBillAirFeeLog; + +/** + * 空运提单费用及操作日志。 + */ +public interface SrvBillAirFeeMapper +{ + List selectByBillCode(String billCode); + + /** 只取这一票提单上仍有效的费用,供修改和删除前核对。 */ + SrvBillAirFee selectLive(@Param("id") Long id, @Param("billCode") String billCode); + + int insertFee(SrvBillAirFee fee); + + int updateFee(SrvBillAirFee fee); + + int deleteFee(@Param("id") Long id, @Param("billCode") String billCode, @Param("updateBy") String updateBy, + @Param("updateTime") java.util.Date updateTime); + + int insertLog(SrvBillAirFeeLog log); + + List selectLogs(String billCode); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/ISrvBillAirFeeService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/ISrvBillAirFeeService.java new file mode 100644 index 00000000..4c2128f7 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/ISrvBillAirFeeService.java @@ -0,0 +1,19 @@ +package com.bms.price.service; + +import java.util.List; +import com.bms.price.airbill.domain.SrvBillAirFee; +import com.bms.price.airbill.domain.SrvBillAirFeeLog; +import com.bms.price.airbill.domain.SrvBillAirFeeSave; + +/** + * 空运提单费用维护。 + */ +public interface ISrvBillAirFeeService +{ + List listFees(String billCode); + + List listLogs(String billCode); + + /** 只写入有变动的行,并按行记录修改前后。返回给页面的提示。 */ + String save(SrvBillAirFeeSave command); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/SrvBillAirFeeServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/SrvBillAirFeeServiceImpl.java new file mode 100644 index 00000000..9cc46dca --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/SrvBillAirFeeServiceImpl.java @@ -0,0 +1,382 @@ +package com.bms.price.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson2.JSON; +import com.bms.common.core.domain.entity.SysDictData; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.common.exception.ServiceException; +import com.bms.common.utils.DateUtils; +import com.bms.common.utils.PageUtils; +import com.bms.common.utils.SecurityUtils; +import com.bms.price.airbill.domain.SrvBillAirFee; +import com.bms.price.airbill.domain.SrvBillAirFeeLog; +import com.bms.price.airbill.domain.SrvBillAirFeeSave; +import com.bms.price.mapper.SrvBillAirFeeMapper; +import com.bms.price.mapper.SrvBillAirMapper; +import com.bms.price.service.ISrvBillAirFeeService; +import com.bms.system.service.ISysDictTypeService; + +/** + * 提单费用只处理本次新增、修改、删除的行。没有变化的费用不更新。 + */ +@Service +public class SrvBillAirFeeServiceImpl implements ISrvBillAirFeeService +{ + private static final String FEE_DICT = "bms_fee_type"; + + private static final String CURRENCY_DICT = "bms_currency"; + + @Autowired + private SrvBillAirFeeMapper feeMapper; + + @Autowired + private SrvBillAirMapper billMapper; + + @Autowired + private ISysDictTypeService dictTypeService; + + @Override + public List listFees(String billCode) + { + requireBill(billCode); + return feeMapper.selectByBillCode(billCode.trim()); + } + + @Override + public List listLogs(String billCode) + { + requireBill(billCode); + PageUtils.startPage(); + List logs = feeMapper.selectLogs(billCode.trim()); + for (SrvBillAirFeeLog log : logs) + { + if (log.getChangeContent() != null && !log.getChangeContent().isBlank()) + { + log.setChanges(JSON.parseArray(log.getChangeContent(), SrvBillAirFeeLog.FieldChange.class)); + } + } + return logs; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String save(SrvBillAirFeeSave command) + { + if (command == null) + { + throw new ServiceException("请提交要保存的费用"); + } + String billCode = requireBill(command.getBillCode()); + List inserts = command.getInserts() == null ? List.of() : command.getInserts(); + List updates = command.getUpdates() == null ? List.of() : command.getUpdates(); + List deletes = command.getDeletes() == null ? List.of() : command.getDeletes(); + if (inserts.isEmpty() && updates.isEmpty() && deletes.isEmpty()) + { + throw new ServiceException("没有需要保存的变更"); + } + Map feeLabels = dictLabels(FEE_DICT, "费用类型"); + Map currencyLabels = dictLabels(CURRENCY_DICT, "币种"); + Operator operator = operator(); + Date now = DateUtils.getNowDate(); + Set seen = new HashSet<>(); + int inserted = 0; + int updated = 0; + int removed = 0; + for (Long id : deletes) + { + if (id == null) + { + throw new ServiceException("要删除的费用缺少编号"); + } + if (!seen.add(id)) + { + throw new ServiceException("同一条费用不能重复提交"); + } + SrvBillAirFee current = liveFee(id, billCode); + if (current == null) + { + throw new ServiceException("费用已删除或不属于该提单"); + } + int rows = feeMapper.deleteFee(current.getId(), billCode, operator.account, now); + if (rows > 0) + { + writeLog(billCode, id, SrvBillAirFeeLog.DELETE, current, null, feeLabels, currencyLabels, operator, now); + removed++; + } + } + for (SrvBillAirFee incoming : updates) + { + if (incoming == null || incoming.getId() == null) + { + throw new ServiceException("要修改的费用缺少编号"); + } + if (!seen.add(incoming.getId())) + { + throw new ServiceException("同一条费用不能重复提交"); + } + SrvBillAirFee current = liveFee(incoming.getId(), billCode); + if (current == null) + { + throw new ServiceException("费用已删除或不属于该提单"); + } + SrvBillAirFee next = normalize(incoming, feeLabels, currencyLabels); + List changes = diff(current, next, feeLabels, currencyLabels); + if (changes.isEmpty()) + { + continue; + } + next.setId(current.getId()); + next.setBillCode(billCode); + next.setUpdateBy(operator.account); + next.setUpdateTime(now); + if (feeMapper.updateFee(next) > 0) + { + writeLog(billCode, current.getId(), SrvBillAirFeeLog.UPDATE, current, next, feeLabels, currencyLabels, operator, now); + updated++; + } + } + for (SrvBillAirFee incoming : inserts) + { + if (incoming == null || blank(incoming.getFeeType()) && incoming.getPrice() == null && blank(incoming.getCurrency()) && blank(incoming.getRemark())) + { + continue; + } + SrvBillAirFee next = normalize(incoming, feeLabels, currencyLabels); + next.setId(null); + next.setBillCode(billCode); + next.setCreateBy(operator.account); + next.setCreateTime(now); + next.setUpdateBy(operator.account); + next.setUpdateTime(now); + feeMapper.insertFee(next); + writeLog(billCode, next.getId(), SrvBillAirFeeLog.INSERT, null, next, feeLabels, currencyLabels, operator, now); + inserted++; + } + if (inserted + updated + removed == 0) + { + throw new ServiceException("没有需要保存的变更"); + } + return "已保存:新增 " + inserted + " 条,修改 " + updated + " 条,删除 " + removed + " 条"; + } + + private SrvBillAirFee liveFee(Long id, String billCode) + { + return feeMapper.selectLive(id, billCode); + } + + private SrvBillAirFee normalize(SrvBillAirFee raw, Map feeLabels, Map currencyLabels) + { + String feeType = trim(raw.getFeeType()); + String currency = trim(raw.getCurrency()); + String remark = trim(raw.getRemark()); + if (feeType.isEmpty()) + { + throw new ServiceException("请选择费用项"); + } + if (feeType.length() > 32 || !feeLabels.containsKey(feeType)) + { + throw new ServiceException("费用项不在费用类型字典中"); + } + if (raw.getPrice() == null) + { + throw new ServiceException("请填写价格"); + } + if (raw.getPrice().signum() < 0) + { + throw new ServiceException("价格不能小于0"); + } + if (raw.getPrice().precision() - raw.getPrice().scale() > 16) + { + throw new ServiceException("价格整数部分不能超过16位"); + } + if (currency.isEmpty()) + { + throw new ServiceException("请选择收费币种"); + } + if (currency.length() > 16 || !currencyLabels.containsKey(currency)) + { + throw new ServiceException("收费币种不在币种字典中"); + } + if (remark.length() > 500) + { + throw new ServiceException("备注不能超过500字"); + } + SrvBillAirFee fee = new SrvBillAirFee(); + fee.setFeeType(feeType); + fee.setPrice(raw.getPrice()); + fee.setCurrency(currency); + fee.setRemark(remark); + return fee; + } + + private void writeLog(String billCode, Long feeId, String operation, SrvBillAirFee before, SrvBillAirFee after, + Map feeLabels, Map currencyLabels, Operator operator, Date now) + { + List changes = diff(before, after, feeLabels, currencyLabels); + SrvBillAirFeeLog log = new SrvBillAirFeeLog(); + log.setBillCode(billCode); + log.setFeeId(feeId); + log.setOperationType(operation); + log.setSummary(cut(summary(operation, changes), 1000)); + log.setChangeContent(JSON.toJSONString(changes)); + log.setCreateBy(operator.account); + log.setCreateByName(operator.name); + log.setCreateTime(now); + feeMapper.insertLog(log); + } + + private static List diff(SrvBillAirFee before, SrvBillAirFee after, + Map feeLabels, Map currencyLabels) + { + List changes = new ArrayList<>(); + addChange(changes, "feeType", "费用类型", label(feeLabels, value(before, SrvBillAirFee::getFeeType)), + label(feeLabels, value(after, SrvBillAirFee::getFeeType))); + addChange(changes, "price", "价格", priceText(before), priceText(after)); + addChange(changes, "currency", "收费币种", label(currencyLabels, value(before, SrvBillAirFee::getCurrency)), + label(currencyLabels, value(after, SrvBillAirFee::getCurrency))); + addChange(changes, "remark", "备注", text(before == null ? null : before.getRemark()), text(after == null ? null : after.getRemark())); + return changes; + } + + private static void addChange(List changes, String field, String fieldLabel, String oldValue, String newValue) + { + String left = oldValue == null ? "" : oldValue; + String right = newValue == null ? "" : newValue; + if (left.equals(right)) + { + return; + } + changes.add(new SrvBillAirFeeLog.FieldChange(field, fieldLabel, left, right)); + } + + private static String summary(String operation, List changes) + { + String action = SrvBillAirFeeLog.INSERT.equals(operation) ? "新增费用" + : SrvBillAirFeeLog.DELETE.equals(operation) ? "删除费用" : "修改费用"; + StringBuilder text = new StringBuilder(action); + for (SrvBillAirFeeLog.FieldChange change : changes) + { + text.append(";").append(change.getFieldLabel()).append(":") + .append(show(change.getOldValue())).append(" → ").append(show(change.getNewValue())); + } + return text.toString(); + } + + private Map dictLabels(String dictType, String name) + { + List rows = dictTypeService.selectDictDataByType(dictType); + Map labels = new LinkedHashMap<>(); + if (rows != null) + { + for (SysDictData row : rows) + { + if (row != null && row.getDictValue() != null && !row.getDictValue().isBlank()) + { + labels.put(row.getDictValue().trim(), row.getDictLabel() == null ? row.getDictValue().trim() : row.getDictLabel().trim()); + } + } + } + if (labels.isEmpty()) + { + throw new ServiceException(name + "字典还没有数据"); + } + return labels; + } + + private String requireBill(String billCode) + { + if (billCode == null || billCode.isBlank()) + { + throw new ServiceException("提单号不能为空"); + } + String code = billCode.trim(); + if (billMapper.selectSrvBillAirByBillCode(code) == null) + { + throw new ServiceException("提单不存在"); + } + return code; + } + + private static Operator operator() + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + String account = user.getUserName() == null ? "" : user.getUserName(); + String name = user.getNickName() == null || user.getNickName().isBlank() ? account : user.getNickName(); + return new Operator(account, name); + } + + private static String value(SrvBillAirFee fee, java.util.function.Function getter) + { + return fee == null ? "" : text(getter.apply(fee)); + } + + private static String priceText(SrvBillAirFee fee) + { + if (fee == null || fee.getPrice() == null) + { + return ""; + } + return fee.getPrice().stripTrailingZeros().toPlainString(); + } + + private static String label(Map labels, String value) + { + if (value == null || value.isBlank()) + { + return ""; + } + return labels.getOrDefault(value, value); + } + + private static String show(String value) + { + return value == null || value.isBlank() ? "空" : value; + } + + private static String text(String value) + { + return value == null ? "" : value.trim(); + } + + private static String trim(String value) + { + return value == null ? "" : value.trim(); + } + + private static boolean blank(String value) + { + return value == null || value.trim().isEmpty(); + } + + private static String cut(String value, int max) + { + if (value == null || value.length() <= max) + { + return value; + } + return value.substring(0, max); + } + + private static final class Operator + { + private final String account; + + private final String name; + + private Operator(String account, String name) + { + this.account = account; + this.name = name; + } + } +} diff --git a/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirFeeMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirFeeMapper.xml new file mode 100644 index 00000000..86a98d92 --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirFeeMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + insert into srv_bill_air_fee ( + bill_code, fee_type, price, currency, remark, + create_by, create_time, update_by, update_time, del_flag + ) values ( + #{billCode}, #{feeType}, #{price}, #{currency}, #{remark}, + #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, '0' + ) + + + + update srv_bill_air_fee + set fee_type = #{feeType}, + price = #{price}, + currency = #{currency}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = #{updateTime} + where id = #{id} + and bill_code = #{billCode} + and del_flag = '0' + + + + update srv_bill_air_fee + set del_flag = '1', + update_by = #{updateBy}, + update_time = #{updateTime} + where id = #{id} + and bill_code = #{billCode} + and del_flag = '0' + + + + insert into srv_bill_air_fee_log ( + bill_code, fee_id, operation_type, summary, change_content, + create_by, create_by_name, create_time + ) values ( + #{billCode}, #{feeId}, #{operationType}, #{summary}, #{changeContent}, + #{createBy}, #{createByName}, #{createTime} + ) + + + + diff --git a/bms-back/sql/price/air_bill_menu.sql b/bms-back/sql/price/air_bill_menu.sql index 5e24971b..8ff30fa4 100644 --- a/bms-back/sql/price/air_bill_menu.sql +++ b/bms-back/sql/price/air_bill_menu.sql @@ -14,6 +14,27 @@ INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, SELECT 2522, N'详情', 2520, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:airBill:query', '#', 'admin', sysdate(), N'提单详情' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2522 OR perms = 'price:airBill:query'); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2529, N'费用', 2520, 3, '', NULL, 1, 0, 'F', '0', '0', 'price:airBill:fee', '#', 'admin', sysdate(), N'维护空运提单费用' +WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2529 OR perms = 'price:airBill:fee'); + INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, m.menu_id FROM (SELECT 2520 AS menu_id UNION SELECT 2521 UNION SELECT 2522) m WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id); + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT 1, fee.menu_id +FROM sys_menu fee +WHERE fee.perms = 'price:airBill:fee' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = fee.menu_id + ); + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT DISTINCT rm.role_id, fee.menu_id +FROM sys_role_menu rm +JOIN sys_menu fee ON fee.perms = 'price:airBill:fee' +WHERE rm.menu_id IN (2520, 2522) + AND NOT EXISTS ( + SELECT 1 FROM sys_role_menu x WHERE x.role_id = rm.role_id AND x.menu_id = fee.menu_id + ); diff --git a/bms-back/sql/price/pay_bill_segment_amount.sql b/bms-back/sql/price/pay_bill_segment_amount.sql new file mode 100644 index 00000000..f577d3ac --- /dev/null +++ b/bms-back/sql/price/pay_bill_segment_amount.sql @@ -0,0 +1,49 @@ +-- 应付账单四段合计。total_amount 为账单合计,等于 A、B、C、D 四段之和。可重复执行。 +SET NAMES utf8mb4; + +SET @sql = ( + SELECT IF( + EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pay_bill' AND COLUMN_NAME = 'amount_a'), + 'SELECT 1', + 'ALTER TABLE pay_bill ADD COLUMN amount_a decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT ''A段合计'' AFTER order_count' + ) +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql = ( + SELECT IF( + EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pay_bill' AND COLUMN_NAME = 'amount_b'), + 'SELECT 1', + 'ALTER TABLE pay_bill ADD COLUMN amount_b decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT ''B段合计'' AFTER amount_a' + ) +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql = ( + SELECT IF( + EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pay_bill' AND COLUMN_NAME = 'amount_c'), + 'SELECT 1', + 'ALTER TABLE pay_bill ADD COLUMN amount_c decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT ''C段合计'' AFTER amount_b' + ) +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql = ( + SELECT IF( + EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pay_bill' AND COLUMN_NAME = 'amount_d'), + 'SELECT 1', + 'ALTER TABLE pay_bill ADD COLUMN amount_d decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT ''D段合计'' AFTER amount_c' + ) +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +ALTER TABLE pay_bill + MODIFY COLUMN total_amount decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT '账单合计'; diff --git a/bms-front/src/api/price/airBill.js b/bms-front/src/api/price/airBill.js index 1f37b2f5..dd2dc4dd 100644 --- a/bms-front/src/api/price/airBill.js +++ b/bms-front/src/api/price/airBill.js @@ -17,3 +17,30 @@ export function getAirBill(billCode) { params: { billCode } }) } + +/** 一票提单的费用明细 */ +export function listAirBillFee(billCode) { + return request({ + url: '/price/airBill/fee/list', + method: 'get', + params: { billCode } + }) +} + +/** 提单费用操作日志,分页参数 pageNum、pageSize */ +export function listAirBillFeeLog(query) { + return request({ + url: '/price/airBill/fee/log', + method: 'get', + params: query + }) +} + +/** 只提交新增、修改、删除的费用 */ +export function saveAirBillFee(data) { + return request({ + url: '/price/airBill/fee/save', + method: 'post', + data + }) +} diff --git a/bms-front/src/views/price/billing/airBill.vue b/bms-front/src/views/price/billing/airBill.vue index ace29c7b..fead2bb6 100644 --- a/bms-front/src/views/price/billing/airBill.vue +++ b/bms-front/src/views/price/billing/airBill.vue @@ -49,18 +49,22 @@ + + +