OrderNewServiceImpl.java 44 KB

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