TWarehouseAgreementServiceImpl.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. package com.ruoyi.warehouseBusiness.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.ruoyi.approvalFlow.domain.AuditItems;
  6. import com.ruoyi.approvalFlow.service.impl.AuditItemsServiceImpl;
  7. import com.ruoyi.basicData.domain.TCorps;
  8. import com.ruoyi.basicData.domain.TFees;
  9. import com.ruoyi.basicData.mapper.TCorpsMapper;
  10. import com.ruoyi.basicData.mapper.TFeesMapper;
  11. import com.ruoyi.basicData.mapper.TGoodsMapper;
  12. import com.ruoyi.common.core.domain.AjaxResult;
  13. import com.ruoyi.common.core.domain.entity.SysUser;
  14. import com.ruoyi.common.core.domain.model.LoginUser;
  15. import com.ruoyi.common.exception.WarehouseException;
  16. import com.ruoyi.common.utils.DateUtils;
  17. import com.ruoyi.common.utils.StringUtils;
  18. import com.ruoyi.system.domain.SysConfig;
  19. import com.ruoyi.system.mapper.SysConfigMapper;
  20. import com.ruoyi.system.mapper.SysDeptMapper;
  21. import com.ruoyi.warehouseBusiness.domain.BillnoDel;
  22. import com.ruoyi.warehouseBusiness.domain.TWarehouseAgreement;
  23. import com.ruoyi.warehouseBusiness.domain.TWarehouseAgreementitems;
  24. import com.ruoyi.warehouseBusiness.domain.dto.CalculateStorageFeesDto;
  25. import com.ruoyi.warehouseBusiness.domain.vo.StorageFeeCalculationResultVO;
  26. import com.ruoyi.warehouseBusiness.mapper.BillnoDelMapper;
  27. import com.ruoyi.warehouseBusiness.mapper.TWarehouseAgreementMapper;
  28. import com.ruoyi.warehouseBusiness.mapper.TWarehouseAgreementitemsMapper;
  29. import com.ruoyi.warehouseBusiness.service.ITWarehouseAgreementService;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  34. import java.math.BigDecimal;
  35. import java.math.RoundingMode;
  36. import java.util.*;
  37. /**
  38. * 仓储费Service业务层处理
  39. *
  40. * @author ruoyi
  41. * @date 2020-12-11
  42. */
  43. @Service
  44. public class TWarehouseAgreementServiceImpl implements ITWarehouseAgreementService {
  45. @Autowired
  46. private TWarehouseAgreementMapper tWarehouseAgreementMapper;
  47. @Autowired
  48. private TWarehouseAgreementitemsMapper tWarehouseAgreementitemsMapper;
  49. @Autowired
  50. private BillnoSerialServiceImpl billnoSerialServiceImpl;
  51. @Autowired
  52. private BillnoDelMapper billnoDelMapper;
  53. @Autowired
  54. private TCorpsMapper tCorpsMapper;
  55. @Autowired
  56. private TGoodsMapper tGoodsMapper;
  57. @Autowired
  58. private TFeesMapper tFeesMapper;
  59. @Autowired
  60. private SysDeptMapper sysDeptMapper;
  61. @Autowired
  62. private SysConfigMapper sysConfigMapper;
  63. @Autowired
  64. private AuditItemsServiceImpl auditItemsService;
  65. /**
  66. * 查询仓储费
  67. *
  68. * @param fId 仓储费ID
  69. * @return 仓储费
  70. */
  71. @Override
  72. public TWarehouseAgreement selectTWarehouseAgreementById(Long fId) {
  73. return tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId);
  74. }
  75. @Override
  76. public Map<String, Object> selectTWarehouseAgreementById1(Long fId) {
  77. Map<String, Object> map = new HashMap<>();
  78. // 查询协议主表数据
  79. TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId);
  80. // 客户表
  81. List<Long> corpsId = new ArrayList<>();
  82. // 用户表
  83. List<SysUser> sysUserList = new ArrayList<>();
  84. // 商品
  85. //List<String> goodsId = new ArrayList<>();
  86. // 费用
  87. List<Long> feesId = new ArrayList<>();
  88. if (!StringUtils.isNull(tWarehouseAgreement)) {
  89. corpsId.add(tWarehouseAgreement.getfCorpid());
  90. //goodsId.add(tWarehouseAgreement.getfGoodsid());
  91. map.put("tWarehouseAgreement", tWarehouseAgreement);
  92. }
  93. // 协议从表
  94. TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems();
  95. tWarehouseAgreementitems.setfPid(fId);
  96. List<TWarehouseAgreementitems> tWarehouseAgreementitemss = tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems);
  97. if (StringUtils.isNotEmpty(tWarehouseAgreementitemss)) {
  98. for (TWarehouseAgreementitems fees : tWarehouseAgreementitemss) {
  99. feesId.add(fees.getfFeeid());
  100. }
  101. }
  102. List<TCorps> corpsList = new ArrayList<>();
  103. List<Long> corpsIdList = StringUtils.integerDeduplication(corpsId);
  104. for (Long corpId : corpsIdList) {
  105. TCorps corps = tCorpsMapper.selectTCorpsById(corpId);
  106. if (StringUtils.isNotNull(corps)) {
  107. corpsList.add(corps);
  108. }
  109. }
  110. /*List<TGoods> goodsList = new ArrayList<>();
  111. List<String> goodsIdList = goodsId.stream().distinct().collect(Collectors.toList());
  112. for (String goods : goodsIdList) {
  113. TGoods tGoods = tGoodsMapper.selectTGoodsById(Long.valueOf(goods));
  114. if (StringUtils.isNotNull(tGoods)) {
  115. goodsList.add(tGoods);
  116. }
  117. }*/
  118. List<TFees> feesList = new ArrayList<>();
  119. List<Long> longList = StringUtils.integerDeduplication(feesId);
  120. for (Long fees : longList) {
  121. TFees tFees = tFeesMapper.selectTFeesById(fees);
  122. if (StringUtils.isNotNull(tFees)) {
  123. feesList.add(tFees);
  124. }
  125. }
  126. map.put("corps", corpsList);
  127. // map.put("goodsList", goodsList);
  128. map.put("feesList", feesList);
  129. map.put("tWarehouseAgreementitems", tWarehouseAgreementitemss);
  130. map.put("dept", sysDeptMapper.selectDeptById(tWarehouseAgreement.getfDeptid()));
  131. return map;
  132. }
  133. /**
  134. * 查询仓储费列表
  135. *
  136. * @param tWarehouseAgreement 仓储费
  137. * @return 仓储费
  138. */
  139. @Override
  140. public List<Map<String, Object>> selectTWarehouseAgreementList1(TWarehouseAgreement tWarehouseAgreement) {
  141. return tWarehouseAgreementMapper.selectTWarehouseAgreementList1(tWarehouseAgreement);
  142. }
  143. /**
  144. * 查询仓储费列表
  145. *
  146. * @param tWarehouseAgreement 仓储费
  147. * @return 仓储费
  148. */
  149. @Override
  150. public List<TWarehouseAgreement> selectTWarehouseAgreementList(TWarehouseAgreement tWarehouseAgreement) {
  151. return tWarehouseAgreementMapper.selectTWarehouseAgreementList(tWarehouseAgreement);
  152. }
  153. /**
  154. * 新增
  155. *
  156. * @param agreement
  157. * @param agreementitems
  158. * @param loginUser
  159. * @return
  160. */
  161. @Override
  162. @Transactional
  163. public AjaxResult insertTWarehouseAgreement(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) {
  164. Long fPid = null;
  165. Map<String, Object> map = new HashMap<>();
  166. TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class);
  167. if (StringUtils.isNull(tWarehouseAgreement.getfId())) {
  168. // 如果是新数据
  169. tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName());
  170. tWarehouseAgreement.setCreateTime(new Date());
  171. // 业务编码
  172. String billNo = billnoSerialServiceImpl.getBillNo("WA", new Date());
  173. tWarehouseAgreement.setfBillno(billNo);
  174. tWarehouseAgreement.setfDeptid(loginUser.getUser().getDeptId());
  175. tWarehouseAgreement.setfFeetypeid((long) fFeetypeid);
  176. tWarehouseAgreement.setfStatus("1"); // 停用
  177. tWarehouseAgreement.setfBillstatus("2"); // 暂存
  178. tWarehouseAgreementMapper.insertTWarehouseAgreement(tWarehouseAgreement);
  179. fPid = tWarehouseAgreement.getfId();
  180. } else {
  181. fPid = tWarehouseAgreement.getfId();
  182. tWarehouseAgreement.setfBillstatus("2");
  183. tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName());
  184. tWarehouseAgreement.setUpdateTime(new Date());
  185. tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement);
  186. tWarehouseAgreementitemsMapper.deleteByFPid(fPid);
  187. }
  188. // 从表添加
  189. if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) {
  190. JSONArray jsonDrArray = JSONArray.parseArray(agreementitems);
  191. List<TWarehouseAgreementitems> tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class);
  192. for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) {
  193. tWarehouseAgreementitems.setfPid(fPid);
  194. tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName());
  195. tWarehouseAgreementitems.setCreateTime(new Date());
  196. tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems);
  197. }
  198. }
  199. TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems();
  200. tWarehouseAgreementitems.setfPid(fPid);
  201. map.put("tWarehouseAgreement", tWarehouseAgreement);
  202. map.put("tWarehouseAgreementitems", tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems));
  203. return AjaxResult.success("成功", map);
  204. }
  205. /**
  206. * 仓储费请核
  207. *
  208. * @param agreement
  209. * @param agreementitems
  210. * @param loginUser
  211. * @param fFeetypeid
  212. * @return
  213. */
  214. @Override
  215. @Transactional
  216. public AjaxResult tWarehouseAgreementSubmit(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) {
  217. Long fPid = null;
  218. TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class);
  219. if (StringUtils.isNull(tWarehouseAgreement.getfId())) {
  220. // 如果是新数据
  221. tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName());
  222. // 业务编码
  223. String billNo = billnoSerialServiceImpl.getBillNo("WA", new Date());
  224. tWarehouseAgreement.setfBillno(billNo);
  225. tWarehouseAgreement.setCreateBy(loginUser.getUser().getUserName());
  226. tWarehouseAgreement.setfDeptid(loginUser.getUser().getDeptId());
  227. tWarehouseAgreement.setfFeetypeid((long) fFeetypeid);
  228. tWarehouseAgreement.setfStatus("1"); // 停用
  229. tWarehouseAgreement.setfBillstatus("4");
  230. tWarehouseAgreementMapper.insertTWarehouseAgreement(tWarehouseAgreement);
  231. fPid = tWarehouseAgreement.getfId();
  232. } else {
  233. fPid = tWarehouseAgreement.getfId();
  234. tWarehouseAgreement.setfBillstatus("4");
  235. tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName());
  236. tWarehouseAgreement.setUpdateTime(new Date());
  237. tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement);
  238. tWarehouseAgreementitemsMapper.deleteByFPid(fPid);
  239. }
  240. // 从表添加
  241. if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) {
  242. JSONArray jsonDrArray = JSONArray.parseArray(agreementitems);
  243. List<TWarehouseAgreementitems> tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class);
  244. for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) {
  245. tWarehouseAgreementitems.setfPid(fPid);
  246. tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName());
  247. tWarehouseAgreementitems.setCreateTime(new Date());
  248. tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems);
  249. }
  250. }
  251. // 这里加个判断取系统参数来确定是否需要启用审批流
  252. String key = "";
  253. boolean isApprove = false;
  254. long actId = 0L;
  255. if (fFeetypeid == 0) {
  256. actId = 310L;
  257. key = "warehouse.storage.ApprovalFlow";
  258. } else if (fFeetypeid == 1) {
  259. actId = 320L;
  260. key = "warehouse.task.ApprovalFlow";
  261. }
  262. SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique(key);
  263. if (StringUtils.isNull(sysConfig)) {
  264. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  265. return AjaxResult.error("系统参数异常,未找到开启审批流参数");
  266. }
  267. if ("0".equals(sysConfig.getConfigValue())) {
  268. isApprove = true;
  269. }
  270. if (isApprove) {
  271. AuditItems auditItems = new AuditItems();
  272. auditItems.setLevelId(0L);
  273. auditItems.setBillId(fPid);
  274. auditItems.setActId(actId);
  275. auditItems.setFidStatus("f_billstatus");
  276. auditItems.setTimes(1L);
  277. auditItems.setIffinalItem("F");
  278. auditItems.setBillNo(tWarehouseAgreement.getfBillno());
  279. auditItems.setRefno1(String.valueOf(tWarehouseAgreement.getfCorpid()));
  280. if (fFeetypeid == 0) {
  281. auditItems.setRefno2("CCF");// 存储业务类型(业务类型)
  282. } else {
  283. auditItems.setRefno2("ZYF");// 存储业务类型(业务类型)
  284. }
  285. auditItems.setSendUserId(loginUser.getUser().getUserId());
  286. auditItems.setSendName(loginUser.getUsername());
  287. auditItems.setSendTime(new Date());
  288. auditItems.setAuditUserId(loginUser.getUser().getUserId());
  289. auditItems.setAuditItem(new Date());
  290. auditItems.setAuditOpTime(new Date());
  291. auditItems.setAuditMsg("提交");
  292. auditItems.setAuditStatus("O");
  293. AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
  294. Long code = Long.valueOf(String.valueOf(approvalFlow.get("code"))).longValue();
  295. if (code.equals(500L)) {
  296. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  297. }
  298. return approvalFlow;
  299. } else {
  300. AjaxResult ajaxResult = agreementFollow(fPid, 6L);
  301. Long code = Long.valueOf(String.valueOf(ajaxResult.get("code"))).longValue();
  302. return ajaxResult;
  303. }
  304. }
  305. @Override
  306. public AjaxResult revoke(String agreement, String agreementitems, LoginUser loginUser, int fFeetypeid) {
  307. Long fPid = null;
  308. TWarehouseAgreement tWarehouseAgreement = JSONArray.parseObject(agreement, TWarehouseAgreement.class);
  309. fPid = tWarehouseAgreement.getfId();
  310. tWarehouseAgreement.setfStatus("1"); // 停用
  311. tWarehouseAgreement.setfBillstatus("2");// 暂存
  312. tWarehouseAgreement.setUpdateBy(loginUser.getUser().getUserName());
  313. tWarehouseAgreement.setUpdateTime(new Date());
  314. tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement);
  315. tWarehouseAgreementitemsMapper.deleteByFPid(fPid);
  316. // 从表添加
  317. if (StringUtils.isNotNull(agreementitems) && !"[]".equals(agreementitems)) {
  318. JSONArray jsonDrArray = JSONArray.parseArray(agreementitems);
  319. List<TWarehouseAgreementitems> tWarehouseAgreementitemsList = JSONObject.parseArray(jsonDrArray.toJSONString(), TWarehouseAgreementitems.class);
  320. for (TWarehouseAgreementitems tWarehouseAgreementitems : tWarehouseAgreementitemsList) {
  321. tWarehouseAgreementitems.setfPid(fPid);
  322. tWarehouseAgreementitems.setCreateBy(loginUser.getUser().getUserName());
  323. tWarehouseAgreementitems.setCreateTime(new Date());
  324. tWarehouseAgreementitemsMapper.insertTWarehouseAgreementitems(tWarehouseAgreementitems);
  325. }
  326. }
  327. return AjaxResult.success();
  328. }
  329. /**
  330. * 根据协议主表id 更新对应明细表状态
  331. *
  332. * @param fPid 协议主表id
  333. * @return 结果
  334. */
  335. @Transactional
  336. public AjaxResult agreementFollow(Long fPid, long fettle) {
  337. if (StringUtils.isNull(fPid)) {
  338. return AjaxResult.error("协议更新状态未找到主表信息,请与管理员联系");
  339. }
  340. TWarehouseAgreement tWarehouseAgreement = new TWarehouseAgreement();
  341. tWarehouseAgreement.setfId(fPid);
  342. tWarehouseAgreement.setfBillstatus(String.valueOf(fettle));
  343. int tFeeUpdateResult = tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement);
  344. if (tFeeUpdateResult <= 0) {
  345. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  346. return AjaxResult.error("更新协议明细状态失败,请联系管理员");
  347. }
  348. return AjaxResult.success();
  349. }
  350. /**
  351. * 修改仓储费
  352. *
  353. * @param tWarehouseAgreement 仓储费
  354. * @return 结果
  355. */
  356. @Override
  357. public int updateTWarehouseAgreement(TWarehouseAgreement tWarehouseAgreement) {
  358. tWarehouseAgreement.setUpdateTime(DateUtils.getNowDate());
  359. return tWarehouseAgreementMapper.updateTWarehouseAgreement(tWarehouseAgreement);
  360. }
  361. /**
  362. * 批量删除仓储费
  363. *
  364. * @param fIds 需要删除的仓储费ID
  365. * @return 结果
  366. */
  367. @Override
  368. public int deleteTWarehouseAgreementByIds(Long[] fIds) {
  369. // 取出业务编号、 放入 billno_del
  370. for (Long id : fIds) {
  371. // 1、查询主表信息
  372. TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(id);
  373. // 2、业务编号、客存编号 放入 billno_del
  374. BillnoDel billnoDel = new BillnoDel();
  375. billnoDel.setBillType("WA");
  376. billnoDel.setBillNo(tWarehouseAgreement.getfBillno());
  377. billnoDelMapper.insertBillnoDel(billnoDel);
  378. }
  379. return tWarehouseAgreementMapper.deleteTWarehouseAgreementByIds(fIds);
  380. }
  381. /**
  382. * 删除仓储费信息
  383. *
  384. * @param fId 仓储费ID
  385. * @return 结果
  386. */
  387. @Override
  388. public int deleteTWarehouseAgreementById(Long fId) {
  389. return tWarehouseAgreementMapper.deleteTWarehouseAgreementById(fId);
  390. }
  391. @Override
  392. public AjaxResult queryRemove(Long fId) {
  393. // 查询协议主表数据
  394. TWarehouseAgreement tWarehouseAgreement = tWarehouseAgreementMapper.selectTWarehouseAgreementById(fId);
  395. TWarehouseAgreementitems tWarehouseAgreementitems = new TWarehouseAgreementitems();
  396. tWarehouseAgreementitems.setfPid(tWarehouseAgreement.getfId());
  397. List<TWarehouseAgreementitems> tWarehouseAgreementitemss = tWarehouseAgreementitemsMapper.selectTWarehouseAgreementitemsList(tWarehouseAgreementitems);
  398. if (StringUtils.isNull(tWarehouseAgreement)) {
  399. return AjaxResult.success("0");
  400. } else if (StringUtils.isNotNull(tWarehouseAgreement) && StringUtils.isEmpty(tWarehouseAgreementitemss)) {
  401. return AjaxResult.success("1");
  402. } else {
  403. return AjaxResult.success("2");
  404. }
  405. }
  406. /**
  407. * 计算存储费用
  408. *
  409. * @param storageFeesDto 参数
  410. * @return 结果
  411. * @author shanxin
  412. */
  413. public StorageFeeCalculationResultVO getCarryingCost(CalculateStorageFeesDto storageFeesDto) {
  414. if (null == storageFeesDto.getfCorpid() ||
  415. null == storageFeesDto.getfGoodsid() ||
  416. null == storageFeesDto.getDays() ||
  417. null == storageFeesDto.getEarlySumDays() ||
  418. null == storageFeesDto.getWarehouseId() ||
  419. null == storageFeesDto.getStartTime() ||
  420. null == storageFeesDto.getEndTime() ||
  421. null == storageFeesDto.getCangKey()) {
  422. throw new WarehouseException("缺少查询计费规则条件");
  423. }
  424. List<TWarehouseAgreementitems> itemList =
  425. this.tWarehouseAgreementitemsMapper.getItemsBytWarehouseAgreementMsg(storageFeesDto.getfCorpid(),
  426. storageFeesDto.getfGoodsid(),
  427. String.valueOf(storageFeesDto.getWarehouseId()), storageFeesDto.getCangKey());
  428. if (CollUtil.isEmpty(itemList)) {
  429. throw new WarehouseException("编号" + storageFeesDto.getfMblno() + "未找到计费规则");
  430. }
  431. // 如果仓储费出现两个不同计费单位就进行抛异常
  432. long count = itemList.stream().map(TWarehouseAgreementitems::getfFeeunitid).distinct().count();
  433. if (count > 1) {
  434. throw new WarehouseException("计费规则存在多条,请确认");
  435. }
  436. // 获取要计算的数量
  437. TWarehouseAgreementitems agreementitems = itemList.stream().findFirst()
  438. .orElseThrow(() -> new WarehouseException("计费规则不存在"));
  439. BigDecimal qty = acquiredQuantity(storageFeesDto, agreementitems.getfFeeunitid());
  440. if (qty.compareTo(BigDecimal.ZERO) < 1) {
  441. return null;
  442. }
  443. BigDecimal money = BigDecimal.ZERO;
  444. Long dayLength;
  445. Long feeId = 0L;
  446. // 备注 天X钱=金额
  447. String remark = "";
  448. // 计费区间 月日-月日X钱
  449. String billingInterval = "";
  450. for (TWarehouseAgreementitems tWarehouseAgreementitems : itemList) {
  451. if (storageFeesDto.getDays() < 1) {
  452. break;
  453. }
  454. // 计算仓储日期
  455. dayLength = tWarehouseAgreementitems.getfEndays() - tWarehouseAgreementitems.getfFromdays() + 1L; //阶梯中的结束-开始日期
  456. if (storageFeesDto.getEarlySumDays() >= dayLength) {
  457. storageFeesDto.setEarlySumDays(storageFeesDto.getEarlySumDays() - dayLength);
  458. continue; //将已算账的天数 与 计费规则的 最后一天作比较如果 已算10天 > 规则结束 不算帐
  459. }
  460. String details;
  461. String interval;
  462. if (storageFeesDto.getDays() >= dayLength) {
  463. feeId = tWarehouseAgreementitems.getfFeeid();
  464. BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), dayLength);
  465. money = money.add(calculate);
  466. storageFeesDto.setDays(storageFeesDto.getDays() - dayLength);
  467. // 计算费用明细
  468. details = assemblyBillingDetails(dayLength, tWarehouseAgreementitems.getfPrice(), qty, calculate);
  469. // 计算区间费用信息
  470. interval = assemblyBillingInterval(storageFeesDto.getStartTime(), dayLength.intValue(), tWarehouseAgreementitems.getfPrice());
  471. if (StringUtils.isEmpty(remark)) {
  472. remark = details;
  473. } else {
  474. remark = remark + "," + details;
  475. }
  476. if (StringUtils.isEmpty(billingInterval)) {
  477. billingInterval = interval;
  478. } else {
  479. billingInterval = billingInterval + "," + interval;
  480. }
  481. } else {
  482. feeId = tWarehouseAgreementitems.getfFeeid();
  483. BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), storageFeesDto.getDays());
  484. money = money.add(calculate);
  485. // 计算费用明细
  486. details = assemblyBillingDetails(storageFeesDto.getDays(), tWarehouseAgreementitems.getfPrice(), qty, calculate);
  487. // 计算区间费用信息
  488. interval = assemblyBillingInterval(storageFeesDto.getStartTime(), storageFeesDto.getDays().intValue(), tWarehouseAgreementitems.getfPrice());
  489. if (StringUtils.isEmpty(remark)) {
  490. remark = details;
  491. } else {
  492. remark = remark + "," + details;
  493. }
  494. if (StringUtils.isEmpty(billingInterval)) {
  495. billingInterval = interval;
  496. } else {
  497. billingInterval = billingInterval + "," + interval;
  498. }
  499. break;
  500. }
  501. }
  502. return StorageFeeCalculationResultVO.builder()
  503. .qty(qty)
  504. .amt(money)
  505. .feeId(feeId)
  506. .remark(remark)
  507. .unit(agreementitems.getfFeeunitid())
  508. .billingInterval(billingInterval)
  509. .build();
  510. }
  511. /**
  512. * 根据不同计费单位获取不同 计算库存明细数量
  513. *
  514. * @param storageFeesDto 库存明细
  515. * @param unit 计费单位
  516. * @return 结果
  517. */
  518. public BigDecimal acquiredQuantity(CalculateStorageFeesDto storageFeesDto, Long unit) {
  519. BigDecimal fQty = new BigDecimal(0);
  520. // 件数
  521. long boxNum = 1;
  522. // 毛重
  523. long grossWeight = 2;
  524. // 净重
  525. long netWeight = 3;
  526. // 尺码
  527. long size = 4;
  528. // 统一
  529. long fixed = 5;
  530. if (unit.equals(boxNum)) {
  531. return storageFeesDto.getfQty().setScale(2, RoundingMode.HALF_UP);
  532. } else if (unit.equals(grossWeight)) {
  533. fQty = storageFeesDto.getfGrossweight();
  534. } else if (unit.equals(netWeight)) {
  535. fQty = storageFeesDto.getfNetweight();
  536. } else if (unit.equals(size)) {
  537. fQty = storageFeesDto.getfVolumn();
  538. } else if (unit.equals(fixed)) {
  539. fQty = BigDecimal.ONE;
  540. }
  541. // 结果值除以1000 保留两位
  542. BigDecimal divisor = new BigDecimal("1000");
  543. return fQty.divide(divisor, 2, BigDecimal.ROUND_HALF_UP);
  544. }
  545. /**
  546. * 组装运费明细记录
  547. *
  548. * @param dayLength 天数
  549. * @param price 单价
  550. * @param itemNums 数量
  551. * @param calculate 金额
  552. */
  553. private String assemblyBillingDetails(Long dayLength, BigDecimal price, BigDecimal itemNums, BigDecimal calculate) {
  554. return dayLength + "天*" + price + "元*" + itemNums + " = " + calculate + "元";
  555. }
  556. /**
  557. * 计算计费区间
  558. *
  559. * @param startTime 开始时间
  560. * @param days 推进天数
  561. * @param price 单价
  562. * @return 计算计费区间
  563. */
  564. private String assemblyBillingInterval(Date startTime, int days, BigDecimal price) {
  565. return DateUtils.dateTime(startTime) + "->" + DateUtils.dateTime(DateUtils.dateAdd(startTime, days)) +
  566. "*" + price + "元";
  567. }
  568. /**
  569. * 数量 * 单价 * 天数
  570. *
  571. * @param itemNumsBig 数量
  572. * @param unitPrice 单价
  573. * @param dateLength 天数
  574. * @return
  575. */
  576. public BigDecimal getCalculate(BigDecimal itemNumsBig, BigDecimal unitPrice, Long dateLength) {
  577. BigDecimal money = new BigDecimal(0);
  578. BigDecimal bigDaysBig = new BigDecimal(dateLength);
  579. money = itemNumsBig.multiply(unitPrice).multiply(bigDaysBig);
  580. return money;
  581. }
  582. }