TWarehouseAgreementServiceImpl.java 34 KB

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