diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java index 90f1be7f6..4a9205390 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java @@ -16,8 +16,10 @@ import com.xdadan.erp.common.core.page.TableDataInfo; import com.xdadan.erp.common.enums.BusinessType; import com.xdadan.erp.emis.domain.EmisWriteoffApply; import com.xdadan.erp.emis.domain.EmisWriteoffApplyDetail; +import com.xdadan.erp.emis.domain.EmisSalesmenRel; import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.service.IEmisWriteoffApplyService; +import com.xdadan.erp.emis.service.IEmisSalesmenRelService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,6 +30,7 @@ import java.util.Arrays; import java.util.List; import java.math.BigDecimal; import java.util.stream.Collectors; +import java.util.Map; /** * 销账申请Controller @@ -42,6 +45,9 @@ public class EmisWriteoffApplyController extends EmisBaseController { @Autowired private IEmisWriteoffApplyService emisWriteoffApplyService; + @Autowired + private IEmisSalesmenRelService emisSalesmenRelService; + /** * 查询销账申请列表 */ @@ -433,10 +439,96 @@ public class EmisWriteoffApplyController extends EmisBaseController { List list = emisWriteoffApplyService .selectEmisWriteoffApplyDetailListByBillCodes(billCodeList); - return AjaxResult.success(list != null ? list : new java.util.ArrayList<>()); + + if (list == null || list.isEmpty()) { + return AjaxResult.success(new java.util.ArrayList<>()); + } + + // 获取当前登录用户信息 + String currentEmpName = getLoginUser().getUser().getEmpName(); + + // 验证权限和账单状态 + for (EmisWriteoffApplyDetail detail : list) { + // 1. 验证用户权限:检查是否是运单的销售联系人/回款联系人/销售联系人关联的助理 + if (!hasPermissionToViewBill(detail, currentEmpName)) { + return error("您没有权限查看运单 " + detail.getBillCode() + " 的信息"); + } + + // 2. 验证账单确认状态:检查账单是否已确认 + if (!isBillConfirmed(detail)) { + return error("运单 " + detail.getBillCode() + " 的账单未确认,不允许进行销账申请"); + } + } + + return AjaxResult.success(list); } catch (Exception e) { log.error("根据运单号查询运单、结算账单、结算子账单信息失败", e); return error("查询失败:" + (e.getMessage() != null ? e.getMessage() : "未知错误")); } } + + /** + * 验证用户是否有权限查看运单信息 + * 检查是否是运单的销售联系人/回款联系人/销售联系人关联的助理 + * + * @param detail 销账申请明细 + * @param currentEmpName 当前登录用户姓名 + * @return 是否有权限 + */ + private boolean hasPermissionToViewBill(EmisWriteoffApplyDetail detail, String currentEmpName) { + if (detail == null || detail.getEmisWaybill() == null) { + return false; + } + + String salesmen = detail.getEmisWaybill().getSalesmen(); + String payee = detail.getEmisWaybill().getPayee(); + + // 1. 检查是否是销售联系人 + if (currentEmpName.equals(salesmen)) { + return true; + } + + // 2. 检查是否是回款联系人 + if (currentEmpName.equals(payee)) { + return true; + } + + // 3. 检查是否是销售联系人关联的助理 + if (salesmen != null && !salesmen.trim().isEmpty()) { + EmisSalesmenRel queryRel = new EmisSalesmenRel(); + queryRel.setSalesAss(currentEmpName); + queryRel.setSalesmen(salesmen); + queryRel.setBlOpen("1"); // 只查询启用的关联关系 + + int count = emisSalesmenRelService.checkRelIsValid(queryRel); + if (count > 0) { + return true; + } + } + + return false; + } + + /** + * 验证账单是否已确认 + * + * @param detail 销账申请明细 + * @return 账单是否已确认 + */ + private boolean isBillConfirmed(EmisWriteoffApplyDetail detail) { + if (detail == null) { + return false; + } + + // 检查结算账单确认状态 + if (detail.getEmisSettleBill() != null) { + String billConfirmSite = detail.getEmisSettleBill().getBlConfirmSite(); + + if (!"1".equals(billConfirmSite)) { + return false; + } + } + + return true; + } } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java index 2ec6b06f3..649ccb95e 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java @@ -340,7 +340,16 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm throw new EmisBizError("已审核/已撤销"); } - // 设置审核信息 + // 先更新相关业务数据(在更新审核状态之前进行验证和更新) + List detailList = updateRelatedBusinessData(existingApply, true); + + // 更新运单的付款状态 + updateWaybillPaymentStatus(existingApply, detailList, true); + + // 重算并更新月结客户额度和现金客户额度 + updateCreditLimits(existingApply, detailList); + + // 所有业务数据更新成功后,再更新审核状态 SysUser currentUser = SecurityUtils.getLoginUser().getUser(); emisWriteoffApply.setBlCenterConfirmed(WriteoffApplyStatus.CENTER_APPROVED.statusCode); emisWriteoffApply.setCenterConfirmManCode(currentUser.getEmpCode()); @@ -350,15 +359,6 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm // 更新申请状态 int result = emisWriteoffApplyMapper.auditCenterPass(emisWriteoffApply); - // 更新相关业务数据 - List detailList = updateRelatedBusinessData(existingApply, true); - - // 更新运单的付款状态 - updateWaybillPaymentStatus(existingApply, detailList, true); - - // 重算并更新月结客户额度和现金客户额度 - updateCreditLimits(existingApply, detailList); - // 发送通知给申请人 sendWriteoffApplyNotification(existingApply, "centerPass", null); @@ -482,7 +482,16 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm throw new EmisBizError("已驳回"); } - // 设置驳回信息 + // 先回退相关业务数据(在更新审核状态之前进行回退) + List detailList = rollbackRelatedBusinessData(existingApply); + + // 更新运单的付款状态 + updateWaybillPaymentStatus(existingApply, detailList, false); + + // 重算并更新月结客户额度和现金客户额度 + updateCreditLimits(existingApply, detailList); + + // 所有业务数据回退成功后,再更新审核状态 SysUser currentUser = SecurityUtils.getLoginUser().getUser(); emisWriteoffApply.setBlHeadquartersConfirmed(WriteoffApplyStatus.HEADQUARTERS_REJECTED.statusCode); emisWriteoffApply.setHeadquartersConfirmManCode(currentUser.getEmpCode()); @@ -492,15 +501,6 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm // 更新申请状态 int result = emisWriteoffApplyMapper.auditHeadquartersReject(emisWriteoffApply); - // 回退相关业务数据 - List detailList = rollbackRelatedBusinessData(existingApply); - - // 更新运单的付款状态 - updateWaybillPaymentStatus(existingApply, detailList, false); - - // 重算并更新月结客户额度和现金客户额度 - updateCreditLimits(existingApply, detailList); - // 发送通知给申请人和财务中心审批人员 sendWriteoffApplyNotification(existingApply, "headquartersReject", emisWriteoffApply.getHeadquartersRejectReason()); diff --git a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml index f0b1d904c..0c1e83929 100644 --- a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml @@ -419,6 +419,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -454,6 +456,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -499,7 +503,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sb.open_bill_status as sb_open_bill_status, sb.payment_status as sb_payment_status, sb.charge_status as sb_charge_status, sb.send_piece_sum as sb_send_piece_sum, sb.piece_number as sb_piece_number, sb.fee_weight as sb_fee_weight, sb.uncollected_amount as sb_uncollected_amount, sb.send_money_sum as sb_send_money_sum, sb.refund_amount as sb_refund_amount, - sb.refund_money as sb_refund_money, sb.payee as sb_payee, sb.salesmen as sb_salesmen, sb.credit_period as sb_credit_period, + sb.refund_money as sb_refund_money, sb.payee as sb_payee, sb.salesmen as sb_salesmen, sb.credit_period as sb_credit_period, + sb.bl_confirm_center as sb_bl_confirm_center, sb.bl_confirm_site as sb_bl_confirm_site, sb.create_by as sb_create_by, sb.create_time as sb_create_time, sb.update_by as sb_update_by, sb.update_time as sb_update_time, sb.remark as sb_remark, @@ -511,9 +516,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ssb.cust_no as ssb_cust_no, ssb.cust_name as ssb_cust_name, ssb.customer_code as ssb_customer_code, ssb.customer_name as ssb_customer_name, ssb.invoiced_money as ssb_invoiced_money, ssb.reced_money as ssb_reced_money, ssb.satisfy_money as ssb_satisfy_money, ssb.allowance_money as ssb_allowance_money, ssb.deduction_money as ssb_deduction_money, - ssb.other_money as ssb_other_money, ssb.satisfy_reason as ssb_satisfy_reason, ssb.allowance_reason as ssb_allowance_reason, - ssb.deduction_reason as ssb_deduction_reason, ssb.other_reason as ssb_other_reason, ssb.create_by as ssb_create_by, - ssb.create_time as ssb_create_time, ssb.update_by as ssb_update_by, ssb.update_time as ssb_update_time + ssb.other_money as ssb_other_money, ssb.satisfy_reason as ssb_satisfy_reason, ssb.allowance_reason as ssb_allowance_reason, + ssb.deduction_reason as ssb_deduction_reason, ssb.other_reason as ssb_other_reason, + ssb.bl_confirm_center as ssb_bl_confirm_center, ssb.bl_confirm_site as ssb_bl_confirm_site, + ssb.create_by as ssb_create_by, ssb.create_time as ssb_create_time, ssb.update_by as ssb_update_by, + ssb.update_time as ssb_update_time from emis_waybill w left join emis_settle_sub_bill ssb on w.bill_code = ssb.bill_code and ssb.del_flag = '0' left join emis_settle_bill sb on ssb.settle_bill_no = sb.settle_bill_no and sb.del_flag = '0'