OrderNewServiceImpl.java 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  1. package com.goafanti.order.service.impl;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.io.UnsupportedEncodingException;
  5. import java.math.BigDecimal;
  6. import java.text.ParseException;
  7. import java.text.SimpleDateFormat;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Calendar;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.Iterator;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.UUID;
  17. import javax.mail.MessagingException;
  18. import javax.servlet.http.HttpServletResponse;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.apache.poi.xssf.usermodel.XSSFCell;
  21. import org.apache.poi.xssf.usermodel.XSSFRow;
  22. import org.apache.poi.xssf.usermodel.XSSFSheet;
  23. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  24. import org.slf4j.Logger;
  25. import org.slf4j.LoggerFactory;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.beans.factory.annotation.Value;
  28. import org.springframework.scheduling.annotation.Async;
  29. import org.springframework.scheduling.annotation.EnableAsync;
  30. import org.springframework.stereotype.Service;
  31. import com.alibaba.fastjson.JSON;
  32. import com.goafanti.admin.bo.AdminListBo;
  33. import com.goafanti.common.bo.EmailBo;
  34. import com.goafanti.common.bo.Error;
  35. import com.goafanti.common.constant.AFTConstants;
  36. import com.goafanti.common.constant.ErrorConstants;
  37. import com.goafanti.common.dao.AdminMapper;
  38. import com.goafanti.common.dao.IdleContractNoMapper;
  39. import com.goafanti.common.dao.NewOrderDunMapper;
  40. import com.goafanti.common.dao.NoticeMapper;
  41. import com.goafanti.common.dao.OrganizationContactBookMapper;
  42. import com.goafanti.common.dao.OrganizationManagementMapper;
  43. import com.goafanti.common.dao.TDunLogMapper;
  44. import com.goafanti.common.dao.TOrderBackMapper;
  45. import com.goafanti.common.dao.TOrderDunMapper;
  46. import com.goafanti.common.dao.TOrderLogMapper;
  47. import com.goafanti.common.dao.TOrderMidMapper;
  48. import com.goafanti.common.dao.TOrderNewMapper;
  49. import com.goafanti.common.dao.TOrderOutsourceMapper;
  50. import com.goafanti.common.dao.TOrderRefundMapper;
  51. import com.goafanti.common.dao.TOrderTaskMapper;
  52. import com.goafanti.common.dao.UserLockReleaseMapper;
  53. import com.goafanti.common.dao.UserMapper;
  54. import com.goafanti.common.enums.NoticeStatus;
  55. import com.goafanti.common.enums.OrderLogProcess;
  56. import com.goafanti.common.error.BusinessException;
  57. import com.goafanti.common.model.Admin;
  58. import com.goafanti.common.model.IdleContractNo;
  59. import com.goafanti.common.model.NewOrderDun;
  60. import com.goafanti.common.model.Notice;
  61. import com.goafanti.common.model.OrganizationContactBook;
  62. import com.goafanti.common.model.OrganizationManagement;
  63. import com.goafanti.common.model.TDunLog;
  64. import com.goafanti.common.model.TOrderBack;
  65. import com.goafanti.common.model.TOrderDun;
  66. import com.goafanti.common.model.TOrderLog;
  67. import com.goafanti.common.model.TOrderMid;
  68. import com.goafanti.common.model.TOrderNew;
  69. import com.goafanti.common.model.TOrderOutsource;
  70. import com.goafanti.common.model.TOrderRefundWithBLOBs;
  71. import com.goafanti.common.model.TOrderTask;
  72. import com.goafanti.common.model.User;
  73. import com.goafanti.common.utils.ExportExcelUtil;
  74. import com.goafanti.common.utils.LoggerUtils;
  75. import com.goafanti.common.utils.SendEmailUtil;
  76. import com.goafanti.core.mybatis.BaseMybatisDao;
  77. import com.goafanti.core.mybatis.JDBCIdGenerator;
  78. import com.goafanti.core.mybatis.page.Pagination;
  79. import com.goafanti.core.shiro.token.TokenManager;
  80. import com.goafanti.customer.bo.LockingReleaseBo;
  81. import com.goafanti.order.bo.OrderDunTaskBo;
  82. import com.goafanti.order.bo.OrderRefundDetailBo;
  83. import com.goafanti.order.bo.OutNewOrderDunBo;
  84. import com.goafanti.order.bo.TDunLogListBo;
  85. import com.goafanti.order.bo.TOrderLogBo;
  86. import com.goafanti.order.bo.TOrderNewBo;
  87. import com.goafanti.order.bo.TOrderRefundBo;
  88. import com.goafanti.order.bo.TOrderTaskBo;
  89. import com.goafanti.order.bo.outOrderDunListBo;
  90. import com.goafanti.order.enums.ActiveState;
  91. import com.goafanti.order.enums.ApprovalNewState;
  92. import com.goafanti.order.enums.LiquidationNewState;
  93. import com.goafanti.order.enums.NewOrderDunType;
  94. import com.goafanti.order.enums.OrderDunSubject;
  95. import com.goafanti.order.enums.OrderNewState;
  96. import com.goafanti.order.enums.ProcessStatus;
  97. import com.goafanti.order.enums.ProjectNewStage;
  98. import com.goafanti.order.enums.TaskState;
  99. import com.goafanti.order.enums.refundState;
  100. import com.goafanti.order.service.OrderNewService;
  101. import com.goafanti.order.service.OrderService;
  102. import com.goafanti.organization.bo.OrganizationListOut;
  103. @Service
  104. @EnableAsync
  105. public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> implements OrderNewService {
  106. @Autowired
  107. private TOrderNewMapper tOrderNewMapper;
  108. @Autowired
  109. private TOrderTaskMapper tOrderTaskMapper;
  110. @Autowired
  111. private NewOrderDunMapper newOrderDunMapper;
  112. @Autowired
  113. private TOrderDunMapper tOrderDunMapper;
  114. @Autowired
  115. private TDunLogMapper tDunLogMapper;
  116. @Autowired
  117. private TOrderMidMapper tOrderMidMapper;
  118. @Autowired
  119. private TOrderRefundMapper tOrderRefundMapper;
  120. @Autowired
  121. private TOrderBackMapper tOrderBackMapper;
  122. @Autowired
  123. private OrganizationContactBookMapper organizationContactBookMapper;
  124. @Autowired
  125. private OrganizationManagementMapper organizationManagementMapper ;
  126. @Autowired
  127. private JDBCIdGenerator idGenerator;
  128. @Autowired
  129. private AdminMapper adminMapper;
  130. @Autowired
  131. private TOrderLogMapper tOrderLogMapper;
  132. @Autowired
  133. private NoticeMapper noticeMapper;
  134. @Autowired
  135. private OrderService orderService;
  136. @Autowired
  137. private IdleContractNoMapper idleContractNoMapper;
  138. @Autowired
  139. private TOrderOutsourceMapper tOrderOutsourceMapper;
  140. @Autowired
  141. private UserLockReleaseMapper userLockReleaseMapper;
  142. @Autowired
  143. private UserMapper userMapper;
  144. @Value(value = "${mobileRemindCodeTemplate}")
  145. private String mobileRemindCodeTemplate = null;
  146. @Value(value = "${upload.path}")
  147. private String uploadPath = null;
  148. @Value(value = "${accessKey}")
  149. private String accessKey = null;
  150. @Value(value = "${accessSecret}")
  151. private String accessSecret = null;
  152. Logger logger = LoggerFactory.getLogger(OrderNewServiceImpl.class);
  153. @Override
  154. public int createServiceOrder(String uid, Integer orderType) {
  155. BigDecimal initial = new BigDecimal(0);
  156. TOrderNew t=new TOrderNew();
  157. t.setOrderNo(idGenerator.generateId().toString());
  158. t.setOrderType(orderType);
  159. t.setOrderStatus(OrderNewState.DQD.getCode());
  160. t.setFirstAmount(initial);
  161. t.setTotalAmount(initial);
  162. t.setSettlementAmount(initial);
  163. t.setLiquidationStatus(LiquidationNewState.WAIT_PAY_FIRST_BALANCE.getCode());
  164. t.setProcessStatus(ProcessStatus.YPYXY.getCode());
  165. t.setProjectStatus(ProjectNewStage.DTJ.getCode());
  166. t.setApproval(ApprovalNewState.FTP.getCode());
  167. t.setDeleteSign(0);//0-正常,1-作废,2-锁定
  168. t.setSalesmanId(TokenManager.getAdminId());
  169. t.setCreater(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  170. t.setOrderDep(adminMapper.selectByPrimaryKey(TokenManager.getAdminId()).getDepartmentId());
  171. t.setCreateTime(new Date());
  172. t.setUpdateTime(new Date());
  173. t.setBuyerId(uid);
  174. return tOrderNewMapper.insertSelective(t);
  175. }
  176. @Override
  177. public int addOrderTask(TOrderTask t) {
  178. TOrderNew order=tOrderNewMapper.selectByPrimaryKey(t.getOrderNo());
  179. checkOrder(order,t);
  180. t.setTaskStatus(TaskState.WFP.getCode());
  181. t.setProjectStatus(ProjectNewStage.DTJ.getCode());
  182. if(t.getCommodityPrice()!=null)order.setTotalAmount(order.getTotalAmount());
  183. return tOrderTaskMapper.insertSelective(t);
  184. }
  185. public void checkOrder(TOrderNew order,TOrderTask t){
  186. if(order == null)
  187. throw new BusinessException(new Error(ErrorConstants.ORDER_NOT_EXIST, "" ,""));
  188. if(order.getDeleteSign() == ActiveState.ABOLISH.getCode())
  189. throw new BusinessException(new Error(ErrorConstants.ORDER_ALREADY_FREEZE, order.getOrderNo(),""));
  190. if(order.getDeleteSign() == ActiveState.LOCKING.getCode())
  191. throw new BusinessException(new Error(ErrorConstants.ORDER_ALREADY_REVOKE, order.getOrderNo(),""));
  192. List<LockingReleaseBo> list=userLockReleaseMapper.checkTask(order.getBuyerId(),t.getCommodityId());
  193. if (list.size()>0) {
  194. for (LockingReleaseBo lockingReleaseBo : list) {
  195. if (!lockingReleaseBo.getAid().equals(TokenManager.getAdminId())) {
  196. throw new BusinessException(new Error( "该业务已经被其他人锁定","该业务已经被其他人锁定"));
  197. }
  198. }
  199. }
  200. }
  201. @Override
  202. public int updateOrderTask(TOrderTask t) {
  203. return tOrderTaskMapper.updateByPrimaryKeySelective(t);
  204. }
  205. @Override
  206. public int delectOrderTask(Integer id) {
  207. //连带催款一起删除
  208. newOrderDunMapper.deleteByTid(id);
  209. return tOrderTaskMapper.deleteByPrimaryKey(id);
  210. }
  211. @Override
  212. public List<TOrderTaskBo> selectOrderTask(String orderNo) {
  213. List<TOrderTaskBo> list=tOrderTaskMapper.selectOrderTask(orderNo);
  214. if (TokenManager.hasRole(AFTConstants.SALESMAN)) {
  215. for (TOrderTaskBo t : list) {
  216. t.setOutsourceName("****");
  217. t.setOutsourcePrice(new BigDecimal(0));
  218. t.setDeclareUser("****");
  219. t.setDeclarePwd("****");
  220. t.setCertificateNumber("****");
  221. }
  222. }
  223. return list;
  224. }
  225. @Override
  226. public int updateServiceOrder(TOrderNew t, Integer isSubmit) {
  227. TOrderNew t2=tOrderNewMapper.selectByPrimaryKey(t.getOrderNo());
  228. //判断手机号码是否存在
  229. if (StringUtils.isNotBlank(t.getContacts())&&StringUtils.isNotBlank(t.getContactMobile())&&
  230. organizationContactBookMapper.checkContacts(t2.getBuyerId(), t2.getContactMobile(),TokenManager.getAdminId()==null?"1":TokenManager.getAdminId() )>0) {
  231. OrganizationContactBook contactBook=new OrganizationContactBook();
  232. contactBook.setId(UUID.randomUUID().toString());
  233. contactBook.setAid(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  234. contactBook.setUid(t2.getBuyerId());
  235. contactBook.setName(t.getContacts());
  236. contactBook.setMobile(t.getContactMobile());
  237. organizationContactBookMapper.insertSelective(contactBook);
  238. }
  239. if (StringUtils.isBlank(t.getOrderDep())) {
  240. t.setOrderDep(adminMapper.selectByPrimaryKey(TokenManager.getAdminId()).getDepartmentId());
  241. }
  242. if (isSubmit==1) {//订单提交
  243. if(t2.getProcessStatus()<ProcessStatus.YPYXGLY.getCode()) {
  244. t.setOrderStatus(OrderNewState.QDDS.getCode());
  245. t.setProcessStatus(ProcessStatus.YPYXGLY.getCode());
  246. }else {
  247. t.setOrderStatus(OrderNewState.QDSHTG.getCode());
  248. }
  249. if (t2.getApproval()==ApprovalNewState.BH.getCode()){
  250. t.setApproval(ApprovalNewState.DSH.getCode());
  251. }
  252. //生成流转
  253. TOrderLog tl=new TOrderLog();
  254. tl.setOrderNo(t.getOrderNo());
  255. tl.setProcess(OrderLogProcess.TJ.getCode());
  256. tl.setAid(TokenManager.getAdminId());
  257. addOrderLog(tl,null);
  258. System.out.println(""+t2.getContractNo());
  259. if (StringUtils.isBlank(t2.getContractNo())) {
  260. //没有合同编号则生成
  261. createContractNo(t);
  262. }else if(!t.getOrderDep().equals(t2.getOrderDep())) {
  263. contractNoReplace(t.getOrderNo(), t2.getContractNo(),t2.getOrderDep());
  264. createContractNo(t);
  265. }
  266. //修改订单中间表信息
  267. updateOrderMid(t);
  268. List<String> aids = new ArrayList<>();
  269. Integer type=null;
  270. AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId());
  271. aids.addAll(adminMapper.listNameByDepAndName(a.getDepartmentId(), "营销管理员"));
  272. type=NoticeStatus.ORDER_START.getCode();
  273. pushGeneralSendNoticeAndEmail(aids, type,t2.getOrderNo(), TokenManager.getAdminId(),t.getApproval());
  274. }
  275. if (t2.getApproval()==ApprovalNewState.BH.getCode()||
  276. t2.getOrderStatus()==OrderNewState.QDSHJJ.getCode()||
  277. t2.getOrderStatus()==OrderNewState.YBH.getCode()) {
  278. t.setCreateTime(new Date());
  279. tOrderBackMapper.updateByOrderNoAndBackStatus(t.getOrderNo());
  280. }
  281. // 0 相等
  282. // -1 小于
  283. // 1 大于
  284. //liquidation_status 清算状态 0-首付待付请,1-尾款待付清,2-已付请,3-部分退款,4-全部退款
  285. //settlement_amount 已付 total_amount 总价格 first_amount首付
  286. if(t2.getLiquidationStatus()!=LiquidationNewState.FULL_REFUND.getCode()) {
  287. if(t2.getSettlementAmount().compareTo(t.getTotalAmount()) == 0){//如果已付等于总价
  288. t.setLiquidationStatus(LiquidationNewState.ALREADY_PAY.getCode());
  289. }else if(t2.getSettlementAmount().compareTo(t.getFirstAmount()) >= 0){//如果大于等于首付
  290. t.setLiquidationStatus(LiquidationNewState.WAIT_PAY_LAST_BALANCE.getCode());
  291. } else if(t2.getSettlementAmount().compareTo(t.getFirstAmount()) < 0){//如果小于首付
  292. t.setLiquidationStatus(LiquidationNewState.WAIT_PAY_FIRST_BALANCE.getCode());
  293. }
  294. }
  295. return tOrderNewMapper.updateByPrimaryKeySelective(t);
  296. }
  297. private void updateOrderMid(TOrderNew t) {
  298. TOrderMid tm=tOrderMidMapper.selectByOrderNo(t.getOrderNo());
  299. Admin admin=adminMapper.selectFinanceAdminByOrderDep(t.getOrderDep());
  300. Admin a=adminMapper.selectAllByid(TokenManager.getAdminId());
  301. User u=userMapper.selectByPrimaryKey(t.getBuyerId());
  302. if (tm==null) tm=new TOrderMid();
  303. tm.setOrderNo(t.getOrderNo());
  304. if (u!=null&&u.getNickname()!=null) {
  305. tm.setBuyerName(u.getNickname());
  306. }
  307. if (admin!=null&&admin.getName()!=null) {
  308. tm.setFinanceId(admin.getId());
  309. tm.setFinanceName(admin.getName());
  310. }
  311. if(a.getId()!=null&&a.getName()!=null) {
  312. tm.setSalesmanId(a.getId());
  313. tm.setSalesmanName(a.getName());
  314. }
  315. if (tm.getId()!=null) {
  316. tOrderMidMapper.updateByPrimaryKeySelective(tm);
  317. }else {
  318. tOrderMidMapper.insertSelective(tm);
  319. }
  320. }
  321. /**
  322. * 新建合同编号,优先获取闲置合同编号,否则按年份生成编号
  323. * @param t
  324. */
  325. private void createContractNo(TOrderNew t) {
  326. //根据订单部门或许合同编号前缀
  327. OrganizationManagement dep=organizationManagementMapper.selectByPrimaryKey(t.getOrderDep());
  328. //获取日期年份
  329. Calendar c=Calendar.getInstance();
  330. int y=c.get(Calendar.YEAR);
  331. if (dep==null||StringUtils.isBlank(dep.getAbbreviation())) {
  332. throw new BusinessException(new Error( "该部门缩写不存在","该部门缩写不存在"));
  333. }
  334. IdleContractNo i=idleContractNoMapper.selectByAbbreviation(dep.getAbbreviation(),y);
  335. if (i!=null&&i.getContractNo()!=null) {
  336. t.setContractNo(i.getContractNo());
  337. idleContractNoMapper.deleteByPrimaryKey(i.getId());
  338. }else {
  339. //根据前缀查询最大编号
  340. String max=organizationManagementMapper.getMaxAbbreviation(dep.getAbbreviation()+"-");
  341. String sno=null;
  342. if (StringUtils.isBlank(max)||max.length()<13) {
  343. String cn=""+dep.getAbbreviation()+"-"+y+"0001";
  344. cn=iterationNo(cn,dep.getAbbreviation(),y,1);
  345. t.setContractNo(cn);
  346. }else {
  347. int ty=Integer.parseInt(max.substring(max.indexOf("-")+1, max.length()-4));
  348. int no=Integer.parseInt(max.substring(max.length()-4, max.length()));
  349. //得出字符串
  350. sno = countNo(dep.getAbbreviation(), sno, ty, no);
  351. //迭代得出最后编码
  352. sno=iterationNo(sno,dep.getAbbreviation(),ty,no);
  353. //年份小于等于则获取最大值加1,大于则获取最新年份
  354. if (y<=ty) {
  355. t.setContractNo(sno);
  356. }else {
  357. t.setContractNo(""+dep.getAbbreviation()+"-"+y+"0001");
  358. }
  359. }
  360. }
  361. }
  362. private String iterationNo(String sno ,Object mp, int ty, int no) {
  363. if (tOrderNewMapper.checkContractNo(sno)>0) {
  364. int i=Integer.parseInt(sno.substring(sno.indexOf("-")+5, sno.length()));
  365. sno=countNo(mp, sno, ty, i);
  366. sno=iterationNo(sno,mp,ty,i);
  367. }
  368. return sno;
  369. }
  370. private String countNo(Object object, String sno, int ty, int no) {
  371. no++;
  372. if (no>0&&no<10) {
  373. sno=object+"-"+ty+"000"+no;
  374. }else if (no>9&&no<100) {
  375. sno=object+"-"+ty+"00"+no;
  376. } else if (no>99&&no<1000) {
  377. sno=object+"-"+ty+"0"+no;
  378. } else if(no>1000){
  379. sno=object+"-"+ty+no;
  380. }
  381. return sno;
  382. }
  383. public void addOrderLog(TOrderLog tl, String reason) {
  384. tl.setAid(TokenManager.getAdminId());
  385. if(reason!=null)tl.setRemarks(reason);
  386. tOrderLogMapper.insertSelective(tl);
  387. }
  388. @Override
  389. public TOrderNewBo getOrderNewDetail(String orderNo) {
  390. TOrderNewBo tOrder= tOrderNewMapper.getOrderNewDetail(orderNo);
  391. return tOrder;
  392. }
  393. @Override
  394. public int createOrderDun(String orderDun,String orderNo) {
  395. List<TOrderDun> l= JSON.parseArray(orderDun, TOrderDun.class);
  396. List<TOrderDun> l2=tOrderDunMapper.selectByOrderNoDunSubject(orderNo);
  397. if (l!=null&&!l.isEmpty()) {
  398. for (TOrderDun t : l) {
  399. if (t.getId()==null||t.getId().equals("")) {//Id为空新增
  400. if (tOrderDunMapper.checkOrderDun(t.getDunSubject(),orderNo)>0) {
  401. throw new BusinessException(new Error( "该截点已经存在","该截点已经存在"));
  402. }
  403. t.setId(UUID.randomUUID().toString());
  404. t.setDunBy(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  405. t.setDunStatus(0);//未启动
  406. tOrderDunMapper.insertSelective(t);
  407. }else {
  408. tOrderDunMapper.updateByPrimaryKeySelective(t);
  409. }
  410. }
  411. }
  412. boolean flag=true;
  413. for (TOrderDun t2 : l2) {
  414. if (l.isEmpty()) {
  415. tOrderDunMapper.deleteByPrimaryKey(t2.getId());
  416. }else {
  417. for (TOrderDun t : l) {
  418. if (t2.getId().equals(t.getId())) {//查询集合与返回集合比较查出删除项
  419. flag=false;
  420. }
  421. }
  422. if (t2.getId()!=null&&flag) {
  423. tOrderDunMapper.deleteByPrimaryKey(t2.getId());
  424. }
  425. flag=true;
  426. }
  427. }
  428. return 1;
  429. }
  430. @SuppressWarnings("unchecked")
  431. @Override
  432. public Pagination<TOrderNewBo> orderNewList(String name, String orderNo, String starTime, String endTime,Integer specially,Integer approval,
  433. Integer distribution,String depId,String contractNo,Integer outsource,Integer liquidationStatus, Integer amountStatus, Integer pageNo, Integer pageSize) {
  434. Map<String, Object> params = new HashMap<String, Object>();
  435. if(pageSize==null||pageSize<0)pageSize=10;
  436. if(pageNo==null||pageNo<0)pageNo=1;
  437. if (specially!=null&&(specially==0||specially==1||specially==2||specially==4||specially==5)) {
  438. //0 个人 1 营销员管理 2 驳回 3 特批 4 咨询师管理 5部门订单查询
  439. if (specially!=3&&specially!=4) {
  440. params.put("aid", TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  441. }
  442. //(咨询师管理列表 0 未分配 1部分 2全部)
  443. if(specially==4) params.put("distribution",distribution);
  444. // 计算出所有本部门及所属部门的ID
  445. if(specially==1||specially==5) params.put("deps", orderService.selectMyDeps());
  446. }
  447. params.put("specially",specially);
  448. if (StringUtils.isNotBlank(name)) params.put("name", name);
  449. if (StringUtils.isNotBlank(depId)) params.put("depId", depId);
  450. if (StringUtils.isNotBlank(contractNo)) params.put("contractNo", contractNo);
  451. if (null!=liquidationStatus) params.put("liquidationStatus", liquidationStatus);
  452. if (null !=approval)params.put("approval", approval);
  453. if(null != amountStatus) params.put("amountStatus", amountStatus);
  454. if (StringUtils.isNotBlank(orderNo)) params.put("orderNo", orderNo);
  455. if (StringUtils.isNotBlank(starTime)) params.put("starTime", starTime);
  456. if (StringUtils.isNotBlank(endTime)) params.put("endTime", endTime+" 23:59:59");
  457. params.put("outsource", outsource);
  458. Pagination<TOrderNewBo> p = (Pagination<TOrderNewBo>)findPage("selectOrderNewListByPage", "selectOrderNewListCount", params, pageNo, pageSize);
  459. return p;
  460. }
  461. @Override
  462. public int updateOrderNew(String orderNo, Integer orderStatus,String reason,Integer outsource, TOrderOutsource o) {
  463. TOrderNew t= new TOrderNew();
  464. TOrderNew t2= checkDeleteSign(orderNo);
  465. t.setOrderNo(orderNo);
  466. List<String> aids = new ArrayList<>();
  467. Integer type=null;
  468. TOrderLog tl=new TOrderLog();
  469. tl.setAid(TokenManager.getAdminId());
  470. if (orderStatus==OrderNewState.QDSHTG.getCode()) {
  471. t.setOutsource(outsource);
  472. //外包单给外包审核员 否则给财务专员
  473. if(outsource==0) {
  474. t.setProcessStatus(ProcessStatus.YPCWZY.getCode());
  475. //如果是转的暂时不删除外包信息
  476. aids.add(organizationManagementMapper.selectByPrimaryKey(t2.getOrderDep()).getFinanceId());
  477. } else if(outsource==1) {
  478. for (Admin admin : adminMapper.getAdminRoleList("外包审核员")) {
  479. aids.add(admin.getId());
  480. }
  481. t.setProcessStatus(ProcessStatus.YPWBSH.getCode());
  482. tl.setOrderNo(orderNo);
  483. tl.setProcess(OrderLogProcess.FQWB.getCode());
  484. addOrderLog(tl,reason);
  485. }
  486. type=NoticeStatus.ORDER_YES.getCode();
  487. tl.setOrderNo(orderNo);
  488. tl.setProcess(OrderLogProcess.SH.getCode());
  489. //增加日志
  490. addOrderLog(tl,reason);
  491. //非特批增加催款信息
  492. //外包
  493. if(outsource==1) {
  494. o.setRefundStatus(0);
  495. if(o.getId()==null) {
  496. o.setCreateTime(new Date());
  497. tOrderOutsourceMapper.insertSelective(o);
  498. }else {
  499. tOrderOutsourceMapper.updateByPrimaryKeySelective(o);
  500. }
  501. }
  502. if(t2.getApproval()==0)pushOrderDun(t2);
  503. }else if (orderStatus==OrderNewState.QDSHJJ.getCode()) {//如果不通过新增驳回
  504. if (outsource==0) {//非外包
  505. t.setProcessStatus(ProcessStatus.YPYXY.getCode());
  506. addBackOrder(orderNo, reason);
  507. tl.setOrderNo(orderNo);
  508. tl.setProcess(OrderLogProcess.SH.getCode());
  509. addOrderLog(tl,reason);
  510. }
  511. aids.add(t2.getSalesmanId());
  512. type=NoticeStatus.ORDER_NO.getCode();
  513. }
  514. t.setOrderStatus(orderStatus);
  515. tOrderNewMapper.updateByPrimaryKeySelective(t);
  516. if (aids.isEmpty()) {
  517. throw new BusinessException(new Error( "邮件发送失败,对方设置邮箱错误","邮件发送失败,对方设置邮箱错误"));
  518. }
  519. pushGeneralSendNoticeAndEmail(aids, type,t2.getOrderNo(), TokenManager.getAdminId(),t2.getApproval());
  520. return 1;
  521. }
  522. private void pushOrderDun(TOrderNew t2) {
  523. if(t2.getApproval()==0) {
  524. List<OutNewOrderDunBo> list=newOrderDunMapper.selectListNewOrderDun(t2.getOrderNo(),null,0);
  525. for (OutNewOrderDunBo o : list) {
  526. if (o.getDunType()==1) {
  527. o.setStatus(1);
  528. o.setStartTime(new Date());
  529. newOrderDunMapper.updateByPrimaryKeySelective(o);
  530. addNewDunNoticAndSendEmail(t2,o);
  531. }
  532. }
  533. }
  534. }
  535. public void addNewDunNoticAndSendEmail(TOrderNew t2, OutNewOrderDunBo o) {
  536. AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  537. TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(t2.getOrderNo());
  538. addNotic(t2.getOrderNo(),NoticeStatus.ORDER_DUN.getCode(),a, b);
  539. try {
  540. NewDunsendEmail(t2.getOrderNo(),o.getId(), a, b);
  541. } catch (UnsupportedEncodingException | MessagingException e) {
  542. throw new BusinessException(new Error("邮件发送错误。"));
  543. }
  544. }
  545. public void addTimingTaskNewDunNoticAndSendEmail(TOrderNew t2, OutNewOrderDunBo o) {
  546. AdminListBo a = adminMapper.getDeptNameByAid("1");
  547. TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(t2.getOrderNo());
  548. addNotic(t2.getOrderNo(),NoticeStatus.ORDER_DUN.getCode(),a, b);
  549. try {
  550. NewDunsendEmail(t2.getOrderNo(),o.getId(), a, b);
  551. } catch (UnsupportedEncodingException | MessagingException e) {
  552. throw new BusinessException(new Error("邮件发送错误。"));
  553. }
  554. }
  555. public void NewDunsendEmail(String orderNo,Integer dunId,AdminListBo a,TOrderNewBo b) throws UnsupportedEncodingException, MessagingException{
  556. LoggerUtils.debug(logger, "======================邮件信息发送===================");
  557. NewOrderDun ob=newOrderDunMapper.selectByPrimaryKey(dunId);
  558. AdminListBo a2 = adminMapper.getDeptNameByAid(b.getSalesmanId());
  559. String dunTypeName="";
  560. if(ob.getDunType()!=null&&ob.getProjectType()!=null) {
  561. dunTypeName= NewOrderDunType.getValueByCode(Integer.valueOf(""+ob.getProjectType()+ob.getDunType()));
  562. }
  563. //发送驳回邮件
  564. if(SendEmailUtil.isEmail(b.getEmail())) {
  565. EmailBo bo = new EmailBo("催收通知", b.getEmail(), a.getDepartmentName(), a.getName(),
  566. "", orderNo,new SimpleDateFormat("yyyy-MM-dd").format(ob.getCreateTime()),dunTypeName,a2.getName(),b.getUserName(),1,0);
  567. if(StringUtils.isNotBlank(b.getEmail())) {
  568. SendEmailUtil.getInstance().patentSend(bo);
  569. }
  570. LoggerUtils.debug(logger, "=========================================发送邮件成功");
  571. }
  572. }
  573. private void addBackOrder(String orderNo, String reason) {
  574. TOrderBack ob=new TOrderBack();
  575. TOrderNew tOrder= tOrderNewMapper.selectByPrimaryKey(orderNo);
  576. ob.setCreateTime(new Date());
  577. ob.setOrderNo(orderNo);
  578. ob.setReason(reason);
  579. ob.setBackStatus(0);//待处理
  580. ob.setInitiate(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  581. ob.setAccept(tOrder.getSalesmanId());
  582. TOrderLog tl=new TOrderLog();
  583. tl.setOrderNo(orderNo);
  584. tl.setProcess(OrderLogProcess.BH.getCode());
  585. addOrderLog(tl,null);
  586. tOrderBackMapper.insertSelective(ob);
  587. }
  588. @SuppressWarnings("unchecked")
  589. @Override
  590. public Pagination<outOrderDunListBo> dunOrderNewList(String name, String orderNo, String starTime, String endTime,
  591. Integer specially, String adminName,String depId,Integer newStatus,Integer pageNo, Integer pageSize) {
  592. Map<String, Object> params = new HashMap<String, Object>();
  593. if(pageSize==null||pageSize<0)pageSize=10;
  594. if(pageNo==null||pageNo<0)pageNo=1;
  595. if(newStatus!=null&&newStatus==0)params.put("newStatus", 0);
  596. else params.put("newStatus", tOrderDunMapper.selectByOrderNo(orderNo).isEmpty()?1:0);
  597. if (StringUtils.isNotBlank(name)) params.put("name", name);
  598. if (StringUtils.isNotBlank(depId)) params.put("depId", depId);
  599. if (StringUtils.isNotBlank(adminName)) params.put("adminName", adminName);
  600. if (StringUtils.isNotBlank(orderNo)) params.put("orderNo", orderNo);
  601. if (StringUtils.isNotBlank(starTime)) params.put("starTime", starTime);
  602. if (StringUtils.isNotBlank(endTime)) params.put("endTime", endTime+" 23:59:59");
  603. Integer i=null;
  604. if(TokenManager.hasRole(AFTConstants.SALESMAN)) {
  605. params.put("aid", TokenManager.getAdminId());
  606. } else if (TokenManager.hasRole(AFTConstants.FINANCE)) {
  607. i=1;
  608. params.put("fid", TokenManager.getAdminId());
  609. }else if (TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)) {
  610. i=2;
  611. params.put("fid", TokenManager.getAdminId());
  612. }
  613. if (TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)||TokenManager.hasRole(AFTConstants.VICE_CEO)||
  614. TokenManager.hasRole(AFTConstants.SUPERADMIN)||TokenManager.hasRole(AFTConstants.CED)||
  615. TokenManager.hasRole(AFTConstants.APPROVAL_DECISION))i=3;
  616. if(i!=null)params.put("shiroType", i);
  617. Pagination<outOrderDunListBo> p = (Pagination<outOrderDunListBo>)findPage("selectDunOrderNewListByPage", "selectDunOrderNewListCount", params, pageNo, pageSize);
  618. return p;
  619. }
  620. @Override
  621. public int createDunLog(String dunId,String dumTime,String remarks) {
  622. TDunLog d=new TDunLog();
  623. d.setId(UUID.randomUUID().toString());
  624. d.setDunId(dunId);
  625. d.setDumBy(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  626. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  627. try {
  628. d.setDumTime(sdf.parse(dumTime));
  629. } catch (ParseException e) {
  630. e.printStackTrace();
  631. }
  632. d.setRemarks(remarks);
  633. return tDunLogMapper.insertSelective(d);
  634. }
  635. @Override
  636. public List<TDunLogListBo> selectDunLogList(String dunId) {
  637. return tDunLogMapper.selectByDunId(dunId);
  638. }
  639. @Override
  640. public int addOrderRefund(TOrderRefundWithBLOBs t) {
  641. TOrderNew order =checkDeleteSign(t.getOrderNo());
  642. if(order.getDeleteSign()!=0)throw new BusinessException(new Error( "订单变更锁定中","订单变更锁定中"));
  643. t.setRefundStatus(refundState.DSH.getCode());
  644. t.setCreateTime(new Date());
  645. t.setInitiate(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  646. //t.setAccept("1");
  647. t.setAccept(order.getFinanceId());
  648. t.setResult("");
  649. TOrderNew tOrder=new TOrderNew();
  650. tOrder.setOrderNo(t.getOrderNo());
  651. tOrder.setOrderStatus(OrderNewState.TDZ.getCode());
  652. tOrderNewMapper.updateByPrimaryKeySelective(tOrder);
  653. TOrderLog tl=new TOrderLog();
  654. tl.setOrderNo(t.getOrderNo());
  655. tl.setProcess(OrderLogProcess.FQTD.getCode());
  656. addOrderLog(tl,null);
  657. return tOrderRefundMapper.insertSelective(t);
  658. }
  659. @Override
  660. public int updateApprovalOrder(String orderNo,Integer confirm,String reason) {
  661. TOrderNew t=new TOrderNew();
  662. TOrderNew t2=checkDeleteSign(orderNo);
  663. t.setOrderNo(orderNo);
  664. List<String> aids = new ArrayList<>();
  665. Integer type=null;
  666. TOrderLog tl=new TOrderLog();
  667. tl.setOrderNo(orderNo);
  668. if (confirm==2) {
  669. t.setApproval(2);
  670. t.setProcessStatus(ProcessStatus.YPZXSGLY.getCode());
  671. OrganizationListOut oo=organizationManagementMapper.selectAllById(t2.getOrderDep());
  672. t.setFinanceId(oo.getFinanceId());
  673. for (Admin admin : adminMapper.getAdminRoleList("咨询师管理员")) {
  674. aids.add(admin.getId());
  675. }
  676. type=NoticeStatus.ORDER_APPROVA_YES.getCode();
  677. tl.setProcess(OrderLogProcess.TP.getCode());
  678. } else {
  679. t.setApproval(3);
  680. t.setOrderStatus(OrderNewState.YBH.getCode());
  681. t.setProcessStatus(ProcessStatus.YPYXY.getCode());
  682. addBackOrder(orderNo, reason);
  683. tl.setProcess(OrderLogProcess.BH.getCode());
  684. aids.add(t2.getSalesmanId());
  685. type=NoticeStatus.ORDER_APPROVA_NO.getCode();
  686. }
  687. addOrderLog(tl,reason);
  688. pushGeneralSendNoticeAndEmail(aids, type,t2.getOrderNo(), TokenManager.getAdminId(),t2.getApproval());
  689. //新增特批催款信息
  690. return tOrderNewMapper.updateByPrimaryKeySelective(t);
  691. }
  692. @Override
  693. public List<TOrderDun> selectOrderDun(String orderNo) {
  694. return tOrderDunMapper.selectByOrderNoDunSubject(orderNo);
  695. }
  696. @Override
  697. public boolean checkOrderMain(TOrderTask t) {
  698. List<TOrderTaskBo> list=tOrderTaskMapper.selectOrderTask(t.getOrderNo());
  699. int flag=0;
  700. if(t.getMain()==1)flag++;
  701. for (TOrderTask t2 : list) {
  702. if(t2.getMain()==1&&t.getId()==null) {
  703. flag++;
  704. }else if (t2.getMain()==1&&(!t.getId().equals(t2.getId()))) {
  705. flag++;
  706. }
  707. }
  708. if (flag>1) {
  709. return true;
  710. }
  711. return false;
  712. }
  713. @Override
  714. public boolean chekeOrderStatus(String orderNo) {
  715. TOrderNew tOrder= tOrderNewMapper.selectByPrimaryKey(orderNo);
  716. if (tOrder.getOrderStatus()==OrderNewState.QDDS.getCode()||tOrder.getOrderStatus()==OrderNewState.QDSHTG.getCode()) {
  717. return false;
  718. }
  719. return true;
  720. }
  721. @Override
  722. public boolean chekeApprovalOrderStatus(String orderNo) {
  723. TOrderNew tOrder= tOrderNewMapper.selectByPrimaryKey(orderNo);
  724. if (tOrder.getApproval()==ApprovalNewState.FTP.getCode()||
  725. tOrder.getOrderStatus()==OrderNewState.QDSHJJ.getCode()||
  726. tOrder.getOrderStatus()==OrderNewState.YBH.getCode()) {
  727. return true;
  728. }
  729. return false;
  730. }
  731. @Override
  732. public int deleteOrderNew(String orderNo) {
  733. TOrderNew t=tOrderNewMapper.selectByPrimaryKey(orderNo);
  734. if (t.getOrderStatus()==OrderNewState.YBH.getCode()||t.getOrderStatus()==OrderNewState.YTD.getCode()||
  735. t.getOrderStatus()==OrderNewState.DQD.getCode()||t.getOrderStatus()==OrderNewState.QDSHJJ.getCode()) {
  736. t.setOrderNo(orderNo);
  737. t.setDeleteSign(1);//作废
  738. contractNoReplace(orderNo, t.getContractNo(),t.getOrderDep());
  739. t.setContractNo("");
  740. return tOrderNewMapper.updateByPrimaryKeySelective(t);
  741. }
  742. return -1;
  743. }
  744. /**
  745. * 将合同编号置为闲置编号
  746. * @param orderNo
  747. * @param t
  748. */
  749. private void contractNoReplace(String orderNo, String contractNo,String orderDep) {
  750. Calendar c=Calendar.getInstance();
  751. int y=c.get(Calendar.YEAR);
  752. String ys="-"+y;
  753. //判断编号是否类似‘-2019’,是则为有效编号
  754. if (contractNo.contains(ys)) {
  755. IdleContractNo i=new IdleContractNo();
  756. i.setAid(TokenManager.getAdminId());
  757. i.setContractNo(contractNo);
  758. i.setUsedOrderNo(orderNo);
  759. i.setYear(y);
  760. //如果找不到订单部门,则取订单编号-前面的缩写
  761. if(StringUtils.isNotBlank(orderDep)) {
  762. OrganizationManagement o=organizationManagementMapper.selectByPrimaryKey(orderDep);
  763. i.setAbbreviation(o.getAbbreviation());
  764. }else {
  765. i.setAbbreviation(contractNo.substring(0, contractNo.indexOf("-")));
  766. }
  767. idleContractNoMapper.insertSelective(i);
  768. }
  769. }
  770. @Override
  771. public boolean checkOderSettlementAmount(String orderNo) {
  772. TOrderNew tOrder= tOrderNewMapper.selectByPrimaryKey(orderNo);
  773. if (tOrder.getSettlementAmount()==null||
  774. tOrder.getSettlementAmount().doubleValue()==0||
  775. tOrder.getOrderStatus()==OrderNewState.TDZ.getCode()){
  776. return true;
  777. }
  778. return false;
  779. }
  780. @SuppressWarnings("unchecked")
  781. @Override
  782. public Pagination<TOrderRefundBo> orderRefundList(String name, String orderNo, String starTime, String endTime, Integer specially,
  783. Integer pageNo, Integer pageSize) {
  784. Map<String, Object> params = new HashMap<String, Object>();
  785. if(pageSize==null||pageSize<0)pageSize=10;
  786. if(pageNo==null||pageNo<0)pageNo=1;
  787. params.put("aid", TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
  788. if (StringUtils.isNotBlank(name)) params.put("name", name);
  789. if (StringUtils.isNotBlank(orderNo)) params.put("orderNo", orderNo);
  790. if (StringUtils.isNotBlank(starTime)) params.put("starTime", starTime);
  791. if (StringUtils.isNotBlank(endTime)) params.put("endTime", endTime+" 23:59:59");
  792. Pagination<TOrderRefundBo> p = (Pagination<TOrderRefundBo>)findPage("selectOrderRefundListByPage", "selectOrderRefundListCount", params, pageNo, pageSize);
  793. return p;
  794. }
  795. @Override
  796. public boolean checkORderTask(String orderNo) {
  797. List<TOrderTaskBo> list=tOrderTaskMapper.selectOrderTask(orderNo);
  798. for (TOrderTaskBo t : list) {
  799. if (t.getMain()==1) {
  800. return false;
  801. }
  802. }
  803. return true;
  804. }
  805. @Override
  806. public boolean checkORderDun(String orderNo) {
  807. List<OutNewOrderDunBo> list=newOrderDunMapper.selectListNewOrderDun(orderNo, null, null);
  808. if (list==null||list.size()<1) {
  809. return true;
  810. }else {
  811. return false;
  812. }
  813. }
  814. /**
  815. * 获取催款数据
  816. * @throws IOException
  817. */
  818. @Override
  819. public void exportOrderDunData(String name,String orderNo,String starTime,String endTime,Integer specially,String adminName,
  820. String depId,Integer newStatus,Integer pageNo,Integer pageSize,HttpServletResponse response) throws Exception {
  821. OutputStream out = response.getOutputStream();
  822. try {
  823. @SuppressWarnings("unchecked")
  824. List<outOrderDunListBo> list=(List<outOrderDunListBo>) dunOrderNewList( name, orderNo, starTime, endTime,
  825. specially, adminName, depId,newStatus, pageNo, pageSize).getList();
  826. String[] comment = {"合同编号","订单编号","客户名称","订单负责人","订单部门","订单状态","签单金额","结算状态","应收款","已收款","未收款","项目状态","催收科目","催款状态","催款启动时间","签单时间"};
  827. String fileName ="催款信息记录表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
  828. //type 0 变更
  829. XSSFWorkbook wb =ExportExcelUtil.exportTemplateInfoS(comment,"催款信息");
  830. //根据列表编写文档
  831. XSSFSheet sheet =wb.getSheetAt(0);
  832. System.out.println(list.get(0).getAccountsReceivable());
  833. for (outOrderDunListBo ob : list) {
  834. //新增一行
  835. XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
  836. for (int i = 0; i < comment.length; i++) {
  837. //当前列的只
  838. String o = "";
  839. switch (comment[i]) {
  840. // "合同编号","订单编号","客户名称","订单负责人","订单部门","订单状态","项目负责人","签单金额","结算状态","已收款","应收款","项目状态","催收科目","催款启动时间"
  841. case "合同编号": o = ob.getContractNo(); break;
  842. case "订单编号": o = ob.getOrderNo().toString(); break;
  843. case "客户名称": o = ob.getUserName(); break;
  844. case "订单负责人": o = ob.getSalesmanName(); break;
  845. case "订单部门": o = ob.getDepName(); break;
  846. case "订单状态": o = OrderNewState.getValueByCode(ob.getOrderStatus());break;
  847. case "签单金额": o = ob.getTotalAmount().toString(); break;
  848. case "结算状态": o = LiquidationNewState.getValueByCode(ob.getLiquidationStatus()); break;
  849. case "应收款": o = ob.getAccountsReceivable().toString(); break;
  850. case "已收款": o = ob.getSettlementAmount().toString(); break;
  851. case "未收款": o = ob.getUncollectedAmount().toString(); break;
  852. case "项目状态": o = ProjectNewStage.getValueByCode(ob.getProjectStatus()); break;
  853. case "催收科目": o = ob.getDunSubject(); break;
  854. case "催款状态": o = ob.getDunStatus()==0?"未启动":"已启动"; break;
  855. case "催款启动时间": o = ob.getStartDate(); break;
  856. case "签单时间": o = ob.getSignDate(); break;
  857. default: o = ""; break;
  858. }
  859. XSSFCell c = r.createCell(i);
  860. c.setCellValue(o);
  861. }
  862. }
  863. //返回名称及参数
  864. response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
  865. response.setContentType("application/octet-stream;charset=utf-8");
  866. // 返回数据流
  867. wb.write(out);
  868. out.flush();
  869. out.close();
  870. } catch (Exception e) {
  871. throw new BusinessException(new Error("表格生成错误。"));
  872. }finally {
  873. out.flush();
  874. out.close();
  875. }
  876. }
  877. @Override
  878. public int updateOrderOver(String orderNo) {
  879. TOrderNew t=tOrderNewMapper.selectByPrimaryKey(orderNo);
  880. if (t.getLiquidationStatus()!=LiquidationNewState.ALREADY_PAY.getCode()||
  881. t.getProcessStatus()!=ProcessStatus.YQBFPZXSGLY.getCode()) {
  882. return -1;
  883. }
  884. List<TOrderTaskBo> list=tOrderTaskMapper.selectOrderTask(orderNo);
  885. for (TOrderTaskBo task : list) {
  886. if (task.getTaskStatus()!=TaskState.CLYWC.getCode()) {
  887. return -1;
  888. }
  889. }
  890. t.setOrderStatus(OrderNewState.YJX.getCode());
  891. t.setSettlementTime(new Date());
  892. return tOrderNewMapper.updateByPrimaryKeySelective(t);
  893. }
  894. @Override
  895. public OrderRefundDetailBo orderRefundDetail(String id) {
  896. return tOrderNewMapper.orderRefundDetail(id);
  897. }
  898. @Override
  899. public int updateOrderRefund(TOrderRefundWithBLOBs t) {
  900. checkDeleteSign(t.getOrderNo());
  901. return tOrderRefundMapper.updateByPrimaryKeySelective(t);
  902. }
  903. @Override
  904. public int updatetechnicianBackOrder(String orderNo,String reason) {
  905. TOrderNew t = checkDeleteSign(orderNo);
  906. if (t.getSettlementAmount().compareTo(new BigDecimal(0))!=0) {
  907. return -1;
  908. }
  909. t.setOrderStatus(OrderNewState.YBH.getCode());
  910. t.setProcessStatus(ProcessStatus.YPYXY.getCode());
  911. t.setFinanceId("");
  912. addBackOrder(orderNo, reason);
  913. List<String> aids = new ArrayList<>();
  914. aids.add(t.getSalesmanId());
  915. pushGeneralSendNoticeAndEmail(aids, NoticeStatus.ORDER_NO.getCode(),t.getOrderNo(), TokenManager.getAdminId(),t.getApproval());
  916. return tOrderNewMapper.updateByPrimaryKeySelective(t);
  917. }
  918. private TOrderNew checkDeleteSign(String orderNo) {
  919. TOrderNew t=tOrderNewMapper.selectByPrimaryKey(orderNo);
  920. //if(t.getDeleteSign()==2) throw new BusinessException(new Error(ErrorConstants.ORDER_ALREADY_REVOKE, t.getOrderNo(),""));
  921. return t;
  922. }
  923. @Override
  924. public List<OrderDunTaskBo> selectAllOrderDun() {
  925. return tOrderDunMapper.getTaskAllOrderDun();
  926. }
  927. @Override
  928. public void updateOrderDun(TOrderDun tDun) {
  929. tOrderDunMapper.updateByPrimaryKeySelective(tDun);
  930. }
  931. @Override
  932. public void addNoticAndSendEmail(String orderNo,OrderDunTaskBo t,Integer type)
  933. throws UnsupportedEncodingException, MessagingException {
  934. TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(type==NoticeStatus.ORDER_DUN.getCode()?t.getOrderNo():orderNo);
  935. String id="1";
  936. if (type==NoticeStatus.ORDER_DUN.getCode()) id=b.getSalesmanId();
  937. if (type==NoticeStatus.ORDER_BACK.getCode()) id=TokenManager.getAdminId()==null?"1":TokenManager.getAdminId();
  938. AdminListBo a = adminMapper.getDeptNameByAid(id);
  939. sendEmail(type==NoticeStatus.ORDER_DUN.getCode()?t.getOrderNo():orderNo, t==null?null:t.getId(), a, b);
  940. addNotic(type==NoticeStatus.ORDER_DUN.getCode()?t.getOrderNo():orderNo,type,a, b);
  941. }
  942. public void addNotic(String orderNo,Integer type,AdminListBo a,TOrderNewBo b) {
  943. String str=NoticeStatus.getValueByCode(type)+": 订单编号 -"+orderNo+", 操作人:"+a.getDepartmentName()+"-"+a.getName()+"。";
  944. Notice n =new Notice();
  945. n.setId(UUID.randomUUID().toString());
  946. n.setAid(b.getSalesmanId());
  947. n.setNoticeType(type);
  948. n.setContent(str);
  949. n.setReaded(0);//未读
  950. noticeMapper.insertSelective(n);
  951. }
  952. public void sendEmail(String orderNo,String dunId,AdminListBo a,TOrderNewBo b) throws UnsupportedEncodingException, MessagingException{
  953. LoggerUtils.debug(logger, "======================邮件信息发送===================");
  954. String content = "<div>客户名称: "+ b.getUserName() +"</div><div>订单编号: " + orderNo + "</div>";
  955. String tite="订单驳回";
  956. if(StringUtils.isNotBlank(dunId)) {
  957. TOrderDun tDun=tOrderDunMapper.selectByPrimaryKey(dunId);
  958. content +="<div>催收时间: " + new SimpleDateFormat("yyyy-MM-dd").format(tDun.getCreateTime()) +
  959. "</div><div>催收科目: " + OrderDunSubject.getValueByCode(tDun.getDunSubject()) +
  960. "</div><div>催收情况: " + (tDun.getDunStatus()==2?"已完成":"已启动") +"</div>";
  961. tite="催收通知";
  962. }
  963. //发送驳回邮件
  964. EmailBo bo = new EmailBo(tite, b.getEmail(), b.getSalesmanName(), a.getDepartmentName(), a.getName(), content);
  965. if(StringUtils.isNotBlank(b.getEmail())) {
  966. LoggerUtils.debug(logger, "tite:"+tite+" Email:"+ b.getEmail()+" 收件人姓名:"+ b.getSalesmanName()+ " 部门:"+a.getDepartmentName()+ " 发件人姓名:"+a.getName()+" 内容:"+ content);
  967. SendEmailUtil.getInstance().send(bo);
  968. }
  969. LoggerUtils.debug(logger, "=========================================发送邮件成功");
  970. }
  971. @Override
  972. public int updateFinance(String orderNo, String newFinance) {
  973. String aid=TokenManager.getAdminId();
  974. String[] l=orderNo.split(",");
  975. List<String> orderNos=new ArrayList<>(Arrays.asList(l));
  976. tOrderNewMapper.updateFinance(aid,orderNos,newFinance);
  977. return 1;
  978. }
  979. @Override
  980. public List<TOrderLogBo> selectOrderLog(String orderNo) {
  981. return tOrderLogMapper.selectOrderByNo(orderNo);
  982. }
  983. @Async
  984. public void pushGeneralSendNoticeAndEmail(List<String> alist, Integer type,String orderNo,String adminId,Integer approval) {
  985. AdminListBo a = adminMapper.getDeptNameByAid(adminId);
  986. String approvalType="";
  987. if (approval!=ApprovalNewState.FTP.getCode()) approvalType="[特批]";
  988. String str=approvalType+NoticeStatus.getValueByCode(type)+": 订单编号 -"+orderNo+", 操作人:"+a.getDepartmentName()+"-"+a.getName()+"。";
  989. String adminIds="";
  990. List<Notice> nlist=new ArrayList<>();
  991. for (String string : alist) {
  992. Notice n =new Notice();
  993. n.setId(UUID.randomUUID().toString());
  994. n.setNoticeType(type);
  995. n.setContent(str);
  996. n.setCreateTime(new Date());
  997. n.setReaded(0);//未读
  998. n.setAid(string);
  999. nlist.add(n);
  1000. Admin admin = adminMapper.selectAllByid(string);
  1001. if(admin!=null&&SendEmailUtil.isEmail(admin.getEmail().trim()))adminIds+=admin.getEmail()+",";
  1002. }
  1003. if (nlist.isEmpty()||StringUtils.isBlank(adminIds)) {
  1004. throw new BusinessException(new Error( "邮件发送失败,对方设置邮箱错误","邮件发送失败,对方设置邮箱错误"));
  1005. }
  1006. noticeMapper.insertBatch(nlist);
  1007. adminIds=adminIds.substring(0, adminIds.length()-1);
  1008. EmailBo bo = new EmailBo(NoticeStatus.getValueByCode(type), adminIds, a.getDepartmentName(), a.getName(), "请登录查看"
  1009. ,null,null,null,null,null,0,approval);
  1010. try {
  1011. //使用专利邮件模板
  1012. SendEmailUtil.getInstance().patentSend(bo);
  1013. } catch (UnsupportedEncodingException | MessagingException e) {
  1014. throw new BusinessException(new Error( "邮件发送错误","邮件发送错误"));
  1015. }
  1016. }
  1017. @Override
  1018. public void exportOrderTaskData(String orderNo, HttpServletResponse response) throws IOException,BusinessException {
  1019. OutputStream out = response.getOutputStream();
  1020. try {
  1021. List<TOrderTaskBo> list=selectOrderTask(orderNo);
  1022. String[] comment = {"合同编号","订单编号","客户名称","订单负责人","订单部门","订单状态","项目负责人","是否主项目","项目别类","项目名称","项目数量","服务市价","证书編号","项目状态","项目说明","外包(内部)公司","外包(内部)价格"};
  1023. String fileName ="项目信息记录表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
  1024. //type 0 变更
  1025. XSSFWorkbook wb =ExportExcelUtil.exportTemplateInfoS(comment,"项目信息");
  1026. //根据列表编写文档
  1027. XSSFSheet sheet =wb.getSheetAt(0);
  1028. for (TOrderTaskBo ob : list) {
  1029. //新增一行
  1030. XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
  1031. for (int i = 0; i < comment.length; i++) {
  1032. //当前列的只
  1033. String o = "";
  1034. switch (comment[i]) {
  1035. // "合同编号","订单编号","客户名称","订单负责人","订单部门","订单状态","项目负责人","是否主项目","项目别类","项目名称","项目数量",
  1036. // "服务市价","证书編号","项目状态","项目说明"
  1037. case "合同编号": o = ob.getContractNo(); break;
  1038. case "订单编号": o = ob.getOrderNo().toString(); break;
  1039. case "客户名称": o = ob.getUserName(); break;
  1040. case "订单负责人": o = ob.getSalesmanName(); break;
  1041. case "订单部门": o = ob.getDepName(); break;
  1042. case "订单状态": o = OrderNewState.getValueByCode(ob.getOrderStatus());break;
  1043. case "项目负责人": o = ob.getSalesmanName(); break;
  1044. case "是否主项目": o = ob.getMain()==0?"否":"是"; break;
  1045. case "项目别类": o = ob.getCname(); break;
  1046. case "项目名称": o = ob.getCommodityName(); break;
  1047. case "项目数量": o = ob.getCommodityQuantity().toString(); break;
  1048. case "服务市价": o = ob.getCommodityPrice()!=null?ob.getCommodityPrice().toString():""; break;
  1049. case "证书編号": o = ob.getCertificateNumber(); break;
  1050. case "项目状态": o = ProjectNewStage.getValueByCode(ob.getProjectStatus()); break;
  1051. case "项目说明": o = ob.getTaskComment(); break;
  1052. case "外包(内部)公司": o = ob.getOutsourceName(); break;
  1053. case "外包(内部)价格": o = ob.getOutsourcePrice()!=null?ob.getOutsourcePrice().toString():""; break;
  1054. default: o = ""; break;
  1055. }
  1056. XSSFCell c = r.createCell(i);
  1057. c.setCellValue(o);
  1058. }
  1059. }
  1060. //返回名称及参数
  1061. response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
  1062. response.setContentType("application/octet-stream;charset=utf-8");
  1063. // 返回数据流
  1064. wb.write(out);
  1065. out.flush();
  1066. out.close();
  1067. } catch (Exception e) {
  1068. throw new BusinessException(new Error("表格生成错误。"));
  1069. }finally {
  1070. out.flush();
  1071. out.close();
  1072. }
  1073. }
  1074. @Override
  1075. public int pushOutsourceProjectAudit(TOrderOutsource o) {
  1076. o.setRefundStatus(0);
  1077. o.setCreateTime(new Date());
  1078. List<String> aids = new ArrayList<>();
  1079. for (Admin admin : adminMapper.getAdminRoleList("外包审核员")) {
  1080. aids.add(admin.getId());
  1081. }
  1082. TOrderNew t2= checkDeleteSign(o.getOrderNo());
  1083. pushGeneralSendNoticeAndEmail(aids, NoticeStatus.PROJECT_OUTSOURCE_START.getCode(),o.getOrderNo(), TokenManager.getAdminId(),t2.getApproval());
  1084. if (o.getId()!=null) {
  1085. tOrderOutsourceMapper.updateByPrimaryKeySelective(o);
  1086. }else {
  1087. tOrderOutsourceMapper.insertSelective(o);
  1088. }
  1089. return 1;
  1090. }
  1091. }