TWarehouseAgreementServiceImpl.java 31 KB

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