TWarehouseAgreementServiceImpl.java 31 KB

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