package com.dk.mdm.service.mac; import com.dk.common.exception.BaseBusinessException; import com.dk.common.infrastructure.annotaiton.Pagination; import com.dk.common.infrastructure.constant.Constant; import com.dk.common.infrastructure.enums.ErrorCodeEnum; import com.dk.common.model.pojo.PageList; import com.dk.common.response.ResponseCodeEnum; import com.dk.common.response.ResponseResultUtil; import com.dk.common.response.ResponseResultVO; import com.dk.mdm.infrastructure.convert.mac.RecPayConvert; import com.dk.mdm.infrastructure.convert.mac.RecPayItemConvert; import com.dk.mdm.mapper.mac.AccountItemMapper; import com.dk.mdm.mapper.mac.AccountMapper; import com.dk.mdm.mapper.mac.RecPayItemMapper; import com.dk.mdm.mapper.mst.MoneyAccountItemMapper; import com.dk.mdm.mapper.mst.MoneyAccountMapper; import com.dk.mdm.model.pojo.mac.Account; import com.dk.mdm.model.pojo.mac.AccountItem; import com.dk.mdm.model.pojo.mac.RecPay; import com.dk.mdm.mapper.mac.RecPayMapper; import com.dk.common.service.BaseService; import com.dk.common.mapper.BaseMapper; import com.dk.mdm.model.pojo.mac.RecPayItem; import com.dk.mdm.model.pojo.mst.MoneyAccount; import com.dk.mdm.model.pojo.mst.MoneyAccountItem; import com.dk.mdm.model.query.mac.RecPayItemQuery; import com.dk.mdm.model.query.mac.RecPayQuery; import com.dk.mdm.model.response.mac.RecPayItemResponse; import com.dk.mdm.model.response.mac.RecPayResponse; import com.dk.mdm.model.vo.mac.RecPayItemVO; import com.dk.mdm.model.vo.mac.RecPayVO; import com.dk.mdm.service.common.CommonService; import com.dk.mdm.service.mst.MoneyAccountService; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; @Service @Transactional public class RecPayService extends BaseService { @Override public String getPrimaryKey() { return "rp_id"; } @Override public BaseMapper getRepository() { return recPayMapper; } @Autowired private RecPayMapper recPayMapper; @Autowired private RecPayItemService recPayItemService; @Autowired private RecPayItemMapper recPayItemMapper; @Autowired private AccountService accountService; @Autowired private AccountMapper accountMapper; @Autowired private AccountItemService accountItemService; @Autowired private MoneyAccountMapper moneyAccountMapper; @Autowired private AccountItemMapper accountItemMapper; @Autowired private MoneyAccountService moneyAccountService; @Autowired private MoneyAccountItemMapper moneyAccountItemMapper; @Autowired private CommonService commonService; @Autowired private RecPayConvert recPayConvert; @Autowired private RecPayItemConvert recPayItemConvert; /** * @desc : 条件查询 * @author : 付斌 * @date : 2023/1/9 10:40 */ @Pagination public ResponseResultVO> selectByCond(RecPayQuery recPayQuery) { return super.mergeListWithCount(recPayQuery, recPayMapper.selectByCond(recPayQuery), recPayMapper.countByCond(recPayQuery)); } /** * @desc : 查询收款明细 * @author : 付斌 * @date : 2024-02-28 13:25 */ @Pagination public ResponseResultVO> selectRpInfoById(String id) { Map result = new HashMap<>(); // 收款明细 List recPayItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(id)); result.put("recPayItem", recPayItem); // 附件 return ResponseResultUtil.success(result); } /** * @desc : 新建收款 * @author : 付斌 * @date : 2023/1/9 10:49 */ @Transactional( rollbackFor = {Exception.class} ) public ResponseResultVO insertReceipt(RecPayVO recPayVO) { // 获取单号 Map codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false); recPayVO.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString()); // 转化实体 RecPay recPay = recPayConvert.convertToPo(recPayVO); // 总单保存 super.insert(recPay); // 明细保存 if (recPayVO.getItemList() != null && recPayVO.getItemList().size() > 0) { for (RecPayItemVO recPayItemVO : recPayVO.getItemList()) { RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO); recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate()); recPayItemMapper.insert(recPayItem); // 插入账款明细 AccountItem accountItem = new AccountItem(); accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName()) .setObjectId(recPayVO.getObjectId()).setOrgId(recPayVO.getOrgId()).setStaffId(recPayVO.getStaffId()) .setAccDate(recPayVO.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec()) .setBiznisType("t_mac_rec_pay_item").setBiznisId(recPayItem.getItemId()).setBiznisNo(recPayVO.getRpNo()) .setMakeStaff(recPayVO.getMakeStaff()).setCpId(recPayVO.getCpId()); accountItemMapper.insert(accountItem); // 更新收款单上的账款明细Id RecPayItem recPayItemUpdate = new RecPayItem(); recPayItemUpdate.setAccItemId(accountItem.getItemId()).setRpId(recPayVO.getRpId()); recPayItemService.updateByUuid(recPayItemUpdate); // 插入资金流水 MoneyAccountItem moneyAccountItem = new MoneyAccountItem(); moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName()) .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPayVO.getAccDate()) .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId()); moneyAccountItemMapper.insert(moneyAccountItem); // 更新资金账户 MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId()); MoneyAccount moneyAccountUpdate = new MoneyAccount(); moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec())) .setMacId(moneyAccountForUpdate.getMacId()); moneyAccountService.updateByUuid(moneyAccountUpdate); } } // 插入账款总表 Account accountForUpdate = accountMapper.selectByIdForUpdate(recPayVO.getObjectId()); // 没有账款对象,需要新建 if (accountForUpdate == null) { accountForUpdate = new Account(); accountForUpdate.setObjectId(recPayVO.getObjectId()).setObjectType(Constant.ObjectType.CUS.getName()); accountMapper.insert(accountForUpdate); accountForUpdate = accountMapper.selectByIdForUpdate(recPayVO.getObjectId()); } // 更新账款总表上收款的相关字段 Account accountUpdate = new Account(); accountUpdate.setReceipt(accountForUpdate.getReceipt().add(recPayVO.getSumAmtRec()))// 总收款金额 .setReceiptResidue(accountForUpdate.getReceiptResidue().add(recPayVO.getSumAmtRec()))// 可退金额 .setObjectId(accountForUpdate.getObjectId()); accountService.updateByUuid(accountUpdate); return ResponseResultUtil.success(); } /** * @desc : 新建退款 * @author : 付斌 * @date : 2023/1/9 10:49 */ @Transactional( rollbackFor = {Exception.class} ) public ResponseResultVO insertRefund(RecPayVO recPayVO) { // 查总账,看可退金额是否满足 Account accountForUpdate = accountMapper.selectByIdForUpdate(recPayVO.getObjectId()); if (accountForUpdate == null || accountForUpdate.getReceiptResidue().compareTo(recPayVO.getSumAmtRec().abs()) == -1) { throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.RESIDUE_NO_LESS.getMessage()); } // 获取单号 Map codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false); recPayVO.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString()); // 转化实体 RecPay recPay = recPayConvert.convertToPo(recPayVO); // 总单保存 super.insert(recPay); // 明细保存 if (recPayVO.getItemList() != null && recPayVO.getItemList().size() > 0) { for (RecPayItemVO recPayItemVO : recPayVO.getItemList()) { RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO); recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate()); recPayItemMapper.insert(recPayItem); // 插入账款明细 AccountItem accountItem = new AccountItem(); accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName()) .setObjectId(recPayVO.getObjectId()).setOrgId(recPayVO.getOrgId()).setStaffId(recPayVO.getStaffId()) .setAccDate(recPayVO.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec()) .setBiznisType("t_mac_rec_pay_item").setBiznisId(recPayItem.getItemId()).setBiznisNo(recPayVO.getRpNo()) .setMakeStaff(recPayVO.getMakeStaff()).setCpId(recPayVO.getCpId()); accountItemMapper.insert(accountItem); // 更新收款单上的账款明细Id RecPayItem recPayItemUpdate = new RecPayItem(); recPayItemUpdate.setAccItemId(accountItem.getItemId()).setRpId(recPayVO.getRpId()); recPayItemService.updateByUuid(recPayItemUpdate); // 插入资金流水 MoneyAccountItem moneyAccountItem = new MoneyAccountItem(); moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName()) .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPayVO.getAccDate()) .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId()); moneyAccountItemMapper.insert(moneyAccountItem); // 更新资金账户 MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId()); // 如果转账之后账户余额小于0,则提示资金账户余额不足,不能退款 if ((moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec())).compareTo(BigDecimal.ZERO) == -1) { throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.MAC_BALANCE_NO_LESS.getMessage()); } MoneyAccount moneyAccountUpdate = new MoneyAccount(); moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec())) .setMacId(moneyAccountForUpdate.getMacId()); moneyAccountService.updateByUuid(moneyAccountUpdate); } } // 更新账款总表上收款的相关字段 Account accountUpdate = new Account(); accountUpdate.setReceipt(accountForUpdate.getReceipt().add(recPayVO.getSumAmtRec()))// 总收款金额 .setReceiptResidue(accountForUpdate.getReceiptResidue().add(recPayVO.getSumAmtRec()))// 可退金额 .setObjectId(accountForUpdate.getObjectId()); accountService.updateByUuid(accountUpdate); return ResponseResultUtil.success(); } /** * @desc : 编辑方法 * @author : 付斌 * @date : 2023/1/9 10:49 */ @Transactional( rollbackFor = {Exception.class} ) public ResponseResultVO update(RecPayVO recPayVO) { // 将之前的明细全部删除 List recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayVO.getRpId()); // 需要重新计算的资金账户 List macList = new ArrayList<>(); for (RecPayItem recPayItem : recPayItemOriginalList) { // 删除收付款明细 recPayItemMapper.deleteById(recPayItem.getItemId()); // 删除账款明细 accountItemMapper.deleteById(recPayItem.getAccItemId()); // 删除账户流水 moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId()); if (!macList.contains(recPayItem.getMacId())) { macList.add(recPayItem.getMacId()); } } // 新增明细 for (RecPayItemVO recPayItemVO : recPayVO.getItemList()) { RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO); recPayItem.setRpId(recPayVO.getRpId()).setCpId(recPayVO.getCpId()); recPayItemMapper.insert(recPayItem); // 插入账款明细 AccountItem accountItem = new AccountItem(); accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName()) .setObjectId(recPayVO.getObjectId()).setOrgId(recPayVO.getOrgId()).setStaffId(recPayVO.getStaffId()) .setAccDate(recPayVO.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec()) .setBiznisType("t_mac_rec_pay_item").setBiznisId(recPayItem.getItemId()).setBiznisNo(recPayVO.getRpNo()) .setMakeStaff(recPayVO.getMakeStaff()).setCpId(recPayVO.getCpId()); accountItemMapper.insert(accountItem); // 更新收款单上的账款明细Id RecPayItem recPayItemUpdate = new RecPayItem(); recPayItemUpdate.setAccItemId(accountItem.getItemId()).setRpId(recPayVO.getRpId()); recPayItemService.updateByUuid(recPayItemUpdate); // 插入资金流水 MoneyAccountItem moneyAccountItem = new MoneyAccountItem(); moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName()) .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPayVO.getAccDate()) .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId()); moneyAccountItemMapper.insert(moneyAccountItem); if (!macList.contains(recPayItem.getMacId())) { macList.add(recPayItem.getMacId()); } } // 更新总账表的总收款额和可用额 accountService.updateReceipt(recPayVO.getObjectId()); // 更新账户余额 for (String macId : macList) { accountService.updateMac(macId); } // 更新收款单总表 RecPay recPay = recPayConvert.convertToPo(recPayVO); return ResponseResultUtil.success(super.updateByUuid(recPay)); } /** * @desc : 获取订单信息(编辑用) * @author : 付斌 * @date : 2024-03-02 17:27 */ public ResponseResultVO getRpForUpdate(String id) { Map dataInfo = new HashMap<>(); RecPayResponse recPayResponse = recPayMapper.selectById(id); dataInfo.put("data", recPayResponse); // 收款明细 List recPayItemResponse = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(id)); dataInfo.put("dataItem", recPayItemResponse); return ResponseResultUtil.success(dataInfo); } }