package com.ruoyi.warehouseBusiness.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.approvalFlow.domain.AuditItems; import com.ruoyi.approvalFlow.service.impl.AuditItemsServiceImpl; import com.ruoyi.basicData.domain.TCorps; import com.ruoyi.basicData.domain.TFees; import com.ruoyi.basicData.mapper.TCorpsMapper; import com.ruoyi.basicData.mapper.TFeesMapper; import com.ruoyi.basicData.mapper.TGoodsMapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.WarehouseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.warehouseBusiness.domain.BillnoDel; import com.ruoyi.warehouseBusiness.domain.TWarehouseAgreement; import com.ruoyi.warehouseBusiness.domain.TWarehouseAgreementitems; import com.ruoyi.warehouseBusiness.domain.dto.CalculateStorageFeesDto; import com.ruoyi.warehouseBusiness.domain.vo.StorageFeeCalculationResultVO; import com.ruoyi.warehouseBusiness.mapper.BillnoDelMapper; import com.ruoyi.warehouseBusiness.mapper.TWarehouseAgreementMapper; import com.ruoyi.warehouseBusiness.mapper.TWarehouseAgreementitemsMapper; import com.ruoyi.warehouseBusiness.service.ITWarehouseAgreementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; /** * 仓储费Service业务层处理 * * @author ruoyi * @date 2020-12-11 */ @Service public class TWarehouseAgreementServiceImpl implements ITWarehouseAgreementService { @Autowired private TWarehouseAgreementMapper tWarehouseAgreementMapper; @Autowired private TWarehouseAgreementitemsMapper tWarehouseAgreementitemsMapper; @Autowired private BillnoSerialServiceImpl billnoSerialServiceImpl; @Autowired private BillnoDelMapper billnoDelMapper; @Autowired private TCorpsMapper tCorpsMapper; @Autowired private TGoodsMapper tGoodsMapper; @Autowired private TFeesMapper tFeesMapper; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private SysConfigMapper sysConfigMapper; @Autowired private AuditItemsServiceImpl auditItemsService; /** * 查询仓储费 * * @param fId 仓储费ID * @return 仓储费 */ @Override public TWarehouseAgreement selectTWarehouseAgreementById(Long fId) { return tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId); } @Override public Map selectTWarehouseAgreementById1(Long fId) { Map map = new HashMap<>(); // 查询协议主表数据 TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId); // 客户表 List corpsId = new ArrayList<>(); // 用户表 List sysUserList = new ArrayList<>(); // 商品 //List goodsId = new ArrayList<>(); // 费用 List feesId = new ArrayList<>(); if (!StringUtils.isNull(tWarehouseAgreement)) { corpsId.add(tWarehouseAgreement.getfCorpid()); //goodsId.add(tWarehouseAgreement.getfGoodsid()); map.put("tWarehouseAgreement", tWarehouseAgreement); } // 协议从表 TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems(); tWarehouseAgreementitems.setfPid(fId); List tWarehouseAgreementitemss = tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems); if (StringUtils.isNotEmpty(tWarehouseAgreementitemss)) { for (TWarehouseAgreementitems fees : tWarehouseAgreementitemss) { feesId.add(fees.getfFeeid()); } } List corpsList = new ArrayList<>(); List corpsIdList = StringUtils.integerDeduplication(corpsId); for (Long corpId : corpsIdList) { TCorps corps = tCorpsMapper.selectTCorpsById(corpId); if (StringUtils.isNotNull(corps)) { corpsList.add(corps); } } /*List goodsList = new ArrayList<>(); List goodsIdList = goodsId.stream().distinct().collect(Collectors.toList()); for (String goods : goodsIdList) { TGoods tGoods = tGoodsMapper.selectTGoodsById(Long.valueOf(goods)); if (StringUtils.isNotNull(tGoods)) { goodsList.add(tGoods); } }*/ List feesList = new ArrayList<>(); List longList = StringUtils.integerDeduplication(feesId); for (Long fees : longList) { TFees tFees = tFeesMapper.selectTFeesById(fees); if (StringUtils.isNotNull(tFees)) { feesList.add(tFees); } } map.put("corps", corpsList); // map.put("goodsList", goodsList); map.put("feesList", feesList); map.put("tWarehouseAgreementitems", tWarehouseAgreementitemss); map.put("dept", sysDeptMapper.selectDeptById(tWarehouseAgreement.getfDeptid())); return map; } /** * 查询仓储费列表 * * @param tWarehouseAgreement 仓储费 * @return 仓储费 */ @Override public List> selectTWarehouseAgreementList1(TWarehouseAgreement tWarehouseAgreement) { return tWarehouseAgreementMapper.selectTWarehouseAgreementList1(tWarehouseAgreement); } /** * 查询仓储费列表 * * @param tWarehouseAgreement 仓储费 * @return 仓储费 */ @Override public List selectTWarehouseAgreementList(TWarehouseAgreement tWarehouseAgreement) { return tWarehouseAgreementMapper.selectTWarehouseAgreementList(tWarehouseAgreement); } /** * 新增 * * @param agreement * @param agreementitems * @param loginUser * @return */ @Override @Transactional public AjaxResult insertTWarehouseAgreement(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) { Long fPid = null; Map map = new HashMap<>(); TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class); if (StringUtils.isNull(tWarehouseAgreement.getfId())) { // 如果是新数据 tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName()); tWarehouseAgreement.setCreateTime(new Date()); // 业务编码 String billNo = billnoSerialServiceImpl.getBillNo("WA", new Date()); tWarehouseAgreement.setfBillno(billNo); tWarehouseAgreement.setfDeptid(loginUser.getUser().getDeptId()); tWarehouseAgreement.setfFeetypeid((long) fFeetypeid); tWarehouseAgreement.setfStatus("1"); // 停用 tWarehouseAgreement.setfBillstatus("2"); // 暂存 tWarehouseAgreementMapper.insertTWarehouseAgreement(tWarehouseAgreement); fPid = tWarehouseAgreement.getfId(); } else { fPid = tWarehouseAgreement.getfId(); tWarehouseAgreement.setfBillstatus("2"); tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName()); tWarehouseAgreement.setUpdateTime(new Date()); tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement); tWarehouseAgreementitemsMapper.deleteByFPid(fPid); } // 从表添加 if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) { JSONArray jsonDrArray = JSONArray.parseArray(agreementitems); List tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class); for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) { tWarehouseAgreementitems.setfPid(fPid); tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName()); tWarehouseAgreementitems.setCreateTime(new Date()); tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems); } } TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems(); tWarehouseAgreementitems.setfPid(fPid); map.put("tWarehouseAgreement", tWarehouseAgreement); map.put("tWarehouseAgreementitems", tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems)); return AjaxResult.success("成功", map); } /** * 仓储费请核 * * @param agreement * @param agreementitems * @param loginUser * @param fFeetypeid * @return */ @Override @Transactional public AjaxResult tWarehouseAgreementSubmit(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) { Long fPid = null; TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class); if (StringUtils.isNull(tWarehouseAgreement.getfId())) { // 如果是新数据 tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName()); // 业务编码 String billNo = billnoSerialServiceImpl.getBillNo("WA", new Date()); tWarehouseAgreement.setfBillno(billNo); tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName()); tWarehouseAgreement.setfDeptid(loginUser.getUser().getDeptId()); tWarehouseAgreement.setfFeetypeid((long) fFeetypeid); tWarehouseAgreement.setfStatus("1"); // 停用 tWarehouseAgreement.setfBillstatus("4"); tWarehouseAgreementMapper.insertTWarehouseAgreement(tWarehouseAgreement); fPid = tWarehouseAgreement.getfId(); } else { fPid = tWarehouseAgreement.getfId(); tWarehouseAgreement.setfBillstatus("4"); tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName()); tWarehouseAgreement.setUpdateTime(new Date()); tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement); tWarehouseAgreementitemsMapper.deleteByFPid(fPid); } // 从表添加 if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) { JSONArray jsonDrArray = JSONArray.parseArray(agreementitems); List tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class); for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) { tWarehouseAgreementitems.setfPid(fPid); tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName()); tWarehouseAgreementitems.setCreateTime(new Date()); tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems); } } // 这里加个判断取系统参数来确定是否需要启用审批流 String key = ""; boolean isApprove = false; long actId = 0L; if (fFeetypeid == 0) { actId = 310L; key = "warehouse.storage.ApprovalFlow"; } else if (fFeetypeid == 1) { actId = 320L; key = "warehouse.task.ApprovalFlow"; } SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique(key); if (StringUtils.isNull(sysConfig)) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.error("系统参数异常,未找到开启审批流参数"); } if ("0".equals(sysConfig.getConfigValue())) { isApprove = true; } if (isApprove) { AuditItems auditItems = new AuditItems(); auditItems.setLevelId(0L); auditItems.setBillId(fPid); auditItems.setActId(actId); auditItems.setFidStatus("f_billstatus"); auditItems.setTimes(1L); auditItems.setIffinalItem("F"); auditItems.setBillNo(tWarehouseAgreement.getfBillno()); auditItems.setRefno1(String.valueOf(tWarehouseAgreement.getfCorpid())); if (fFeetypeid == 0) { auditItems.setRefno2("CCF");// 存储业务类型(业务类型) } else { auditItems.setRefno2("ZYF");// 存储业务类型(业务类型) } auditItems.setSendUserId(loginUser.getUser().getUserId()); auditItems.setSendName(loginUser.getUsername()); auditItems.setSendTime(new Date()); auditItems.setAuditUserId(loginUser.getUser().getUserId()); auditItems.setAuditItem(new Date()); auditItems.setAuditOpTime(new Date()); auditItems.setAuditMsg("提交"); auditItems.setAuditStatus("O"); AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems); Long code = Long.valueOf(String.valueOf(approvalFlow.get("code"))).longValue(); if (code.equals(500L)) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return approvalFlow; } else { AjaxResult ajaxResult = agreementFollow(fPid, 6L); Long code = Long.valueOf(String.valueOf(ajaxResult.get("code"))).longValue(); return ajaxResult; } } @Override public AjaxResult revoke(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) { Long fPid = null; TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class); fPid = tWarehouseAgreement.getfId(); tWarehouseAgreement.setfStatus("1"); // 停用 tWarehouseAgreement.setfBillstatus("2");// 暂存 tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName()); tWarehouseAgreement.setUpdateTime(new Date()); tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement); tWarehouseAgreementitemsMapper.deleteByFPid(fPid); // 从表添加 if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) { JSONArray jsonDrArray = JSONArray.parseArray(agreementitems); List tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class); for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) { tWarehouseAgreementitems.setfPid(fPid); tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName()); tWarehouseAgreementitems.setCreateTime(new Date()); tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems); } } return AjaxResult.success(); } /** * 根据协议主表id 更新对应明细表状态 * * @param fPid 协议主表id * @return 结果 */ @Transactional public AjaxResult agreementFollow(Long fPid, long fettle) { if (StringUtils.isNull(fPid)) { return AjaxResult.error("协议更新状态未找到主表信息,请与管理员联系"); } TWarehouseAgreement tWarehouseAgreement = new TWarehouseAgreement(); tWarehouseAgreement.setfId(fPid); tWarehouseAgreement.setfBillstatus(String.valueOf(fettle)); int tFeeUpdateResult = tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement); if (tFeeUpdateResult <= 0) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.error("更新协议明细状态失败,请联系管理员"); } return AjaxResult.success(); } /** * 修改仓储费 * * @param tWarehouseAgreement 仓储费 * @return 结果 */ @Override public int updateTWarehouseAgreement(TWarehouseAgreement tWarehouseAgreement) { tWarehouseAgreement.setUpdateTime(DateUtils.getNowDate()); return tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement); } /** * 批量删除仓储费 * * @param fIds 需要删除的仓储费ID * @return 结果 */ @Override public int deleteTWarehouseAgreementByIds(Long[] fIds) { // 取出业务编号、 放入 billno_del for (Long id : fIds) { // 1、查询主表信息 TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(id); // 2、业务编号、客存编号 放入 billno_del BillnoDel billnoDel = new BillnoDel(); billnoDel.setBillType("WA"); billnoDel.setBillNo(tWarehouseAgreement.getfBillno()); billnoDelMapper.insertBillnoDel(billnoDel); } return tWarehouseAgreementMapper.deleteTWarehouseAgreementByIds(fIds); } /** * 删除仓储费信息 * * @param fId 仓储费ID * @return 结果 */ @Override public int deleteTWarehouseAgreementById(Long fId) { return tWarehouseAgreementMapper.deleteTWarehouseAgreementById(fId); } @Override public AjaxResult queryRemove(Long fId) { // 查询协议主表数据 TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId); TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems(); tWarehouseAgreementitems.setfPid(tWarehouseAgreement.getfId()); List tWarehouseAgreementitemss = tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems); if (StringUtils.isNull(tWarehouseAgreement)) { return AjaxResult.success("0"); } else if (StringUtils.isNotNull(tWarehouseAgreement) && StringUtils.isEmpty(tWarehouseAgreementitemss)) { return AjaxResult.success("1"); } else { return AjaxResult.success("2"); } } /** * 计算存储费用 * * @param storageFeesDto 参数 * @return 结果 * @author shanxin */ public StorageFeeCalculationResultVO getCarryingCost(CalculateStorageFeesDto storageFeesDto) { if (null == storageFeesDto.getfCorpid() || null == storageFeesDto.getfGoodsid() || null == storageFeesDto.getDays() || null == storageFeesDto.getEarlySumDays() || null == storageFeesDto.getWarehouseId() || null == storageFeesDto.getStartTime() || null == storageFeesDto.getEndTime() || null == storageFeesDto.getCangKey()) { throw new WarehouseException("缺少查询计费规则条件"); } List itemList = this.tWarehouseAgreementitemsMapper.getItemsBytWarehouseAgreementMsg(storageFeesDto.getfCorpid(), storageFeesDto.getfGoodsid(), String.valueOf(storageFeesDto.getWarehouseId()), storageFeesDto.getCangKey()); if (CollUtil.isEmpty(itemList)) { throw new WarehouseException("编号" + storageFeesDto.getfMblno() + "未找到计费规则"); } // 如果仓储费出现两个不同计费单位就进行抛异常 long count = itemList.stream().map(TWarehouseAgreementitems::getfFeeunitid).distinct().count(); if (count > 1) { throw new WarehouseException("计费规则存在多条,请确认"); } // 获取要计算的数量 TWarehouseAgreementitems agreementitems = itemList.stream().findFirst() .orElseThrow(() -> new WarehouseException("计费规则不存在")); BigDecimal qty = acquiredQuantity(storageFeesDto, agreementitems.getfFeeunitid()); if (qty.compareTo(BigDecimal.ZERO) < 1) { return null; } BigDecimal money = BigDecimal.ZERO; Long dayLength; Long feeId = 0L; // 备注 天X钱=金额 String remark = ""; // 计费区间 月日-月日X钱 String billingInterval = ""; for (TWarehouseAgreementitems tWarehouseAgreementitems : itemList) { if (storageFeesDto.getDays() < 1) { break; } // 计算仓储日期 dayLength = tWarehouseAgreementitems.getfEndays() - tWarehouseAgreementitems.getfFromdays() + 1L; //阶梯中的结束-开始日期 if (storageFeesDto.getEarlySumDays() >= dayLength) { storageFeesDto.setEarlySumDays(storageFeesDto.getEarlySumDays() - dayLength); continue; //将已算账的天数 与 计费规则的 最后一天作比较如果 已算10天 > 规则结束 不算帐 } String details; String interval; if (storageFeesDto.getDays() >= dayLength) { feeId = tWarehouseAgreementitems.getfFeeid(); BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), dayLength); money = money.add(calculate); storageFeesDto.setDays(storageFeesDto.getDays() - dayLength); // 计算费用明细 details = assemblyBillingDetails(dayLength, tWarehouseAgreementitems.getfPrice(), qty, calculate); // 计算区间费用信息 interval = assemblyBillingInterval(storageFeesDto.getStartTime(), dayLength.intValue(), tWarehouseAgreementitems.getfPrice()); if (StringUtils.isEmpty(remark)) { remark = details; } else { remark = remark + "," + details; } if (StringUtils.isEmpty(billingInterval)) { billingInterval = interval; } else { billingInterval = billingInterval + "," + interval; } } else { feeId = tWarehouseAgreementitems.getfFeeid(); BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), storageFeesDto.getDays()); money = money.add(calculate); // 计算费用明细 details = assemblyBillingDetails(storageFeesDto.getDays(), tWarehouseAgreementitems.getfPrice(), qty, calculate); // 计算区间费用信息 interval = assemblyBillingInterval(storageFeesDto.getStartTime(), storageFeesDto.getDays().intValue(), tWarehouseAgreementitems.getfPrice()); if (StringUtils.isEmpty(remark)) { remark = details; } else { remark = remark + "," + details; } if (StringUtils.isEmpty(billingInterval)) { billingInterval = interval; } else { billingInterval = billingInterval + "," + interval; } break; } } return StorageFeeCalculationResultVO.builder() .qty(qty) .amt(money) .feeId(feeId) .remark(remark) .unit(agreementitems.getfFeeunitid()) .billingInterval(billingInterval) .build(); } /** * 根据不同计费单位获取不同 计算库存明细数量 * * @param storageFeesDto 库存明细 * @param unit 计费单位 * @return 结果 */ public BigDecimal acquiredQuantity(CalculateStorageFeesDto storageFeesDto, Long unit) { BigDecimal fQty = new BigDecimal(0); // 件数 long boxNum = 1; // 毛重 long grossWeight = 2; // 净重 long netWeight = 3; // 尺码 long size = 4; // 统一 long fixed = 5; if (unit.equals(boxNum)) { return storageFeesDto.getfQty().setScale(2, RoundingMode.HALF_UP); } else if (unit.equals(grossWeight)) { fQty = storageFeesDto.getfGrossweight(); } else if (unit.equals(netWeight)) { fQty = storageFeesDto.getfNetweight(); } else if (unit.equals(size)) { fQty = storageFeesDto.getfVolumn(); } else if (unit.equals(fixed)) { fQty = BigDecimal.ONE; } // 结果值除以1000 保留两位 BigDecimal divisor = new BigDecimal("1000"); return fQty.divide(divisor, 2, BigDecimal.ROUND_HALF_UP); } /** * 组装运费明细记录 * * @param dayLength 天数 * @param price 单价 * @param itemNums 数量 * @param calculate 金额 */ private String assemblyBillingDetails(Long dayLength, BigDecimal price, BigDecimal itemNums, BigDecimal calculate) { return dayLength + "天*" + price + "元*" + itemNums + " = " + calculate + "元"; } /** * 计算计费区间 * * @param startTime 开始时间 * @param days 推进天数 * @param price 单价 * @return 计算计费区间 */ private String assemblyBillingInterval(Date startTime, int days, BigDecimal price) { return DateUtils.dateTime(startTime) + "->" + DateUtils.dateTime(DateUtils.dateAdd(startTime, days)) + "*" + price + "元"; } /** * 数量 * 单价 * 天数 * * @param itemNumsBig 数量 * @param unitPrice 单价 * @param dateLength 天数 * @return */ public BigDecimal getCalculate(BigDecimal itemNumsBig, BigDecimal unitPrice, Long dateLength) { BigDecimal money = new BigDecimal(0); BigDecimal bigDaysBig = new BigDecimal(dateLength); money = itemNumsBig.multiply(unitPrice).multiply(bigDaysBig); return money; } }