TWarehouseAgreementServiceImpl.java 34 KB

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