MaintainBillServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. package cn.com.lzt.maintainbill.service.impl;
  2. import cn.com.lzt.common.util.DictUtil;
  3. import cn.com.lzt.maintainbill.dao.MaintainBillDao;
  4. import cn.com.lzt.maintainbill.entity.MaintainBillEntity;
  5. import cn.com.lzt.maintainbill.service.MaintainBillServiceI;
  6. import cn.com.lzt.maintainplan.entity.MaintainPlanEntity;
  7. import cn.com.lzt.maintainplantimes.entity.MaintainPlanTimesEntity;
  8. import cn.com.lzt.message.send.entity.MMessageEntity;
  9. import cn.com.lzt.message.send.entity.MessageWxTemplateConfig;
  10. import cn.com.lzt.message.send.service.MMessageSendServiceI;
  11. import cn.com.lzt.useractiviti.data.service.UseractivitiDataServiceI;
  12. import com.xcgl.projecttask.entity.ProjecttaskEntity;
  13. import com.xcgl.projecttask.service.ProjecttaskServiceI;
  14. import com.xcgl.taskplatform.dao.TaskPlatformDao;
  15. import com.xcgl.taskplatform.service.TaskServiceI;
  16. import com.xcgl.taskresult.entity.TaskResultEntity;
  17. import com.xcgl.utils.XcglConstant;
  18. import org.apache.commons.collections.list.SetUniqueList;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.jeecgframework.core.common.service.impl.CommonServiceImpl;
  21. import org.jeecgframework.core.constant.Globals;
  22. import org.jeecgframework.core.util.*;
  23. import org.jeecgframework.p3.core.common.utils.DateUtil;
  24. import org.jeecgframework.web.cgform.enhance.CgformEnhanceJavaInter;
  25. import org.jeecgframework.web.system.pojo.base.TSUser;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import java.io.Serializable;
  30. import java.text.SimpleDateFormat;
  31. import java.util.*;
  32. @Service("maintainBillService")
  33. @Transactional
  34. public class MaintainBillServiceImpl extends CommonServiceImpl implements MaintainBillServiceI {
  35. @Autowired
  36. TaskPlatformDao taskPlatformDao;
  37. @Autowired
  38. TaskServiceI taskService;
  39. @Autowired
  40. MaintainBillDao billdao;
  41. @Autowired
  42. ProjecttaskServiceI projecttaskService;
  43. @Autowired
  44. UseractivitiDataServiceI useractivitiDataService;
  45. @Autowired
  46. MMessageSendServiceI mMessageSendService;
  47. public void delete(MaintainBillEntity entity) throws Exception{
  48. super.delete(entity);
  49. //执行删除操作增强业务
  50. this.doDelBus(entity);
  51. }
  52. public ProjecttaskEntity saveAndGenTask(MaintainBillEntity entity) throws Exception{
  53. Serializable s = save(entity);
  54. ProjecttaskEntity task = taskService.createTask(entity);
  55. return task;
  56. }
  57. public Serializable save(MaintainBillEntity entity) throws Exception{
  58. //如果编码为空,则按照编码规则设置默认编码(编码可编辑)
  59. if(StringUtil.isEmpty(entity.getCode())) {
  60. entity.setCode(com.xcgl.utils.OrderNumTools.generateNextBillCode(getMaxLocalCode("t_b_maintain_bill"),Globals.CODE_PREFIX_MAINTAINBILL,4));
  61. }
  62. //设置项目负责人
  63. Map<String,String> leader = findProjectLeader(entity.getProjectid());
  64. if(leader.size() == 1) {
  65. for(java.util.Map.Entry<String,String> en:leader.entrySet()) {
  66. entity.setTaskuserid(en.getKey());
  67. entity.setTaskusername(en.getValue());
  68. }
  69. }
  70. // 设置合同信息
  71. /*Map<String,String> contract = findContract(entity);
  72. if (contract.size() == 1) {
  73. for(java.util.Map.Entry<String,String> en:contract.entrySet()) {
  74. entity.setContractid(en.getKey());
  75. entity.setContractname(en.getValue());
  76. }
  77. }*/
  78. entity.setCreateDate(new Date());
  79. Serializable t = super.save(entity);
  80. //执行新增操作增强业务
  81. this.doAddBus(entity);
  82. return t;
  83. }
  84. public void saveOrUpdate(MaintainBillEntity entity) throws Exception{
  85. super.saveOrUpdate(entity);
  86. //执行更新操作增强业务
  87. this.doUpdateBus(entity);
  88. }
  89. /**
  90. * 新增操作增强业务
  91. * @param t
  92. * @return
  93. */
  94. private void doAddBus(MaintainBillEntity t) throws Exception{
  95. //-----------------sql增强 start----------------------------
  96. //-----------------sql增强 end------------------------------
  97. //-----------------java增强 start---------------------------
  98. //-----------------java增强 end-----------------------------
  99. }
  100. /**
  101. * 更新操作增强业务
  102. * @param t
  103. * @return
  104. */
  105. private void doUpdateBus(MaintainBillEntity t) throws Exception{
  106. //-----------------sql增强 start----------------------------
  107. //-----------------sql增强 end------------------------------
  108. //-----------------java增强 start---------------------------
  109. //-----------------java增强 end-----------------------------
  110. }
  111. /**
  112. * 删除操作增强业务
  113. * @return
  114. */
  115. private void doDelBus(MaintainBillEntity t) throws Exception{
  116. //-----------------sql增强 start----------------------------
  117. //-----------------sql增强 end------------------------------
  118. //-----------------java增强 start---------------------------
  119. //-----------------java增强 end-----------------------------
  120. }
  121. private Map<String,Object> populationMap(MaintainBillEntity t){
  122. Map<String,Object> map = new HashMap<String,Object>();
  123. map.put("id", t.getId());
  124. map.put("create_name", t.getCreateName());
  125. map.put("create_by", t.getCreateBy());
  126. map.put("create_date", t.getCreateDate());
  127. map.put("update_name", t.getUpdateName());
  128. map.put("update_by", t.getUpdateBy());
  129. map.put("update_date", t.getUpdateDate());
  130. map.put("sys_org_code", t.getSysOrgCode());
  131. map.put("sys_company_code", t.getSysCompanyCode());
  132. map.put("bpm_status", t.getBpmStatus());
  133. map.put("name", t.getName());
  134. map.put("code", t.getCode());
  135. map.put("servicedate", t.getServicedate());
  136. map.put("projectid", t.getProjectid());
  137. map.put("projectname", t.getProjectname());
  138. map.put("servicetypedetail", t.getServicetypedetail());
  139. map.put("projectservcieid", t.getProjectserviceid());
  140. map.put("projectservicename", t.getProjectservicename());
  141. map.put("relatedunitid", t.getRelatedunitid());
  142. map.put("relatedunitname", t.getRelatedunitname());
  143. map.put("step_name", t.getStepName());
  144. map.put("proc_inst_id", t.getProcInstId());
  145. map.put("description", t.getDescription());
  146. map.put("sourcetype", t.getSourcetype());
  147. map.put("score", t.getScore());
  148. map.put("averaged", t.getAveraged());
  149. map.put("valuate", t.getValuate());
  150. map.put("busistatus", t.getBusistatus());
  151. map.put("taskuserid", t.getTaskuserid());
  152. map.put("taskusername", t.getTaskusername());
  153. map.put("contractid", t.getContractid());
  154. map.put("contractname", t.getContractname());
  155. return map;
  156. }
  157. /**
  158. * 替换sql中的变量
  159. * @param sql
  160. * @param t
  161. * @return
  162. */
  163. public String replaceVal(String sql,MaintainBillEntity t){
  164. sql = sql.replace("#{id}",String.valueOf(t.getId()));
  165. sql = sql.replace("#{create_name}",String.valueOf(t.getCreateName()));
  166. sql = sql.replace("#{create_by}",String.valueOf(t.getCreateBy()));
  167. sql = sql.replace("#{create_date}",String.valueOf(t.getCreateDate()));
  168. sql = sql.replace("#{update_name}",String.valueOf(t.getUpdateName()));
  169. sql = sql.replace("#{update_by}",String.valueOf(t.getUpdateBy()));
  170. sql = sql.replace("#{update_date}",String.valueOf(t.getUpdateDate()));
  171. sql = sql.replace("#{sys_org_code}",String.valueOf(t.getSysOrgCode()));
  172. sql = sql.replace("#{sys_company_code}",String.valueOf(t.getSysCompanyCode()));
  173. sql = sql.replace("#{bpm_status}",String.valueOf(t.getBpmStatus()));
  174. sql = sql.replace("#{name}",String.valueOf(t.getName()));
  175. sql = sql.replace("#{code}",String.valueOf(t.getCode()));
  176. sql = sql.replace("#{servicedate}",String.valueOf(t.getServicedate()));
  177. sql = sql.replace("#{projectid}",String.valueOf(t.getProjectid()));
  178. sql = sql.replace("#{projectname}",String.valueOf(t.getProjectname()));
  179. sql = sql.replace("#{servicetypedetail}",String.valueOf(t.getServicetypedetail()));
  180. sql = sql.replace("#{projectservcieid}",String.valueOf(t.getProjectserviceid()));
  181. sql = sql.replace("#{projectservicename}",String.valueOf(t.getProjectservicename()));
  182. sql = sql.replace("#{relatedunitid}",String.valueOf(t.getRelatedunitid()));
  183. sql = sql.replace("#{relatedunitname}",String.valueOf(t.getRelatedunitname()));
  184. sql = sql.replace("#{step_name}",String.valueOf(t.getStepName()));
  185. sql = sql.replace("#{proc_inst_id}",String.valueOf(t.getProcInstId()));
  186. sql = sql.replace("#{description}",String.valueOf(t.getDescription()));
  187. sql = sql.replace("#{sourcetype}",String.valueOf(t.getSourcetype()));
  188. sql = sql.replace("#{score}",String.valueOf(t.getScore()));
  189. sql = sql.replace("#{averaged}",String.valueOf(t.getAveraged()));
  190. sql = sql.replace("#{valuate}",String.valueOf(t.getValuate()));
  191. sql = sql.replace("#{busistatus}",String.valueOf(t.getBusistatus()));
  192. sql = sql.replace("#{taskuserid}",String.valueOf(t.getTaskuserid()));
  193. sql = sql.replace("#{taskusername}",String.valueOf(t.getTaskusername()));
  194. sql = sql.replace("#{contractid}",String.valueOf(t.getContractid()));
  195. sql = sql.replace("#{contractname}",String.valueOf(t.getContractname()));
  196. sql = sql.replace("#{UUID}",UUID.randomUUID().toString());
  197. return sql;
  198. }
  199. /**
  200. * 执行JAVA增强
  201. */
  202. private void executeJavaExtend(String cgJavaType,String cgJavaValue,Map<String,Object> data) throws Exception {
  203. if(StringUtil.isNotEmpty(cgJavaValue)){
  204. Object obj = null;
  205. try {
  206. if("class".equals(cgJavaType)){
  207. //因新增时已经校验了实例化是否可以成功,所以这块就不需要再做一次判断
  208. obj = MyClassLoader.getClassByScn(cgJavaValue).newInstance();
  209. }else if("spring".equals(cgJavaType)){
  210. obj = ApplicationContextUtil.getContext().getBean(cgJavaValue);
  211. }
  212. if(obj instanceof CgformEnhanceJavaInter){
  213. CgformEnhanceJavaInter javaInter = (CgformEnhanceJavaInter) obj;
  214. javaInter.execute("t_b_maintain_bill",data);
  215. }
  216. } catch (Exception e) {
  217. e.printStackTrace();
  218. throw new Exception("执行JAVA增强出现异常!");
  219. }
  220. }
  221. }
  222. private String getMaxLocalCode(String tablename){
  223. StringBuilder sb = new StringBuilder();
  224. sb.append("SELECT code FROM ");
  225. sb.append(tablename);
  226. sb.append(" where left(create_date,10) = '"+ DateUtils.date_sdf.format(new Date())+"' ");
  227. sb.append(" ORDER BY code DESC");
  228. List<Map<String, Object>> objMapList = findForJdbc(sb.toString(), 1, 1);
  229. String returnCode = null;
  230. if(objMapList!=null && objMapList.size()>0){
  231. returnCode = (String)objMapList.get(0).get("code");
  232. }
  233. return returnCode;
  234. }
  235. /**
  236. * 查询项目负责人
  237. * */
  238. private Map<String,String> findProjectLeader(String projectid) {
  239. Map<String,String> leader = new HashMap<String,String>();
  240. List<Map<String, String>> userList = taskPlatformDao.getUserByProjectAndRoleCode(projectid, Globals.roleCode_ProjectManager);
  241. if(userList.size()>0) {
  242. leader.put(userList.get(0).get("userid").toString(),userList.get(0).get("realname").toString());
  243. }
  244. return leader;
  245. }
  246. /**
  247. * 匹配到合同
  248. * */
  249. private Map<String,String> findContract(MaintainBillEntity entity) {
  250. Map<String,String> contract = new HashMap<String,String>();
  251. String sqlContract = "select distinct(con.id),con.name " +
  252. "from t_b_contract_item item " +
  253. "left join t_b_contract con on item.contractid = con.id " +
  254. "where con.projectid =? " +
  255. "and item.serviceid =? " +
  256. "and con.startdate <=? " +
  257. "and con.enddate >=? " +
  258. "and con.bpm_status = '3'" +
  259. "and con.busstatus <> '9'";
  260. List<Map<String, Object>> contractList = findForJdbc(sqlContract, entity.getProjectid(),entity.getProjectserviceid(),entity.getPlandatestart(),entity.getPlandateend());
  261. if(contractList.size()>0) {
  262. contract.put(contractList.get(0).get("id").toString(),contractList.get(0).get("name").toString());
  263. }
  264. return contract;
  265. }
  266. /**
  267. * 根据计划,整理出服务记录单数据,然后调用保存方法
  268. * 保存后,自动生成任务
  269. * */
  270. public void genTaskFromPlan() throws Exception{
  271. Calendar c= Calendar.getInstance();
  272. c.add(Calendar.DAY_OF_MONTH,60);
  273. String firstDay = DateUtil.formatDateTime(c.getTime(),"yyy-MM-dd")+" 23:59:59";
  274. List<MaintainBillEntity> billList = billdao.getMaintainBillFromPlan(firstDay,null);
  275. String code = getMaxLocalCode("t_b_maintain_bill");
  276. for(MaintainBillEntity entity : billList) {
  277. code = com.xcgl.utils.OrderNumTools.generateNextBillCode(code,Globals.CODE_PREFIX_MAINTAINBILL,4);
  278. entity.setCode(code);
  279. List<String> years = SetUniqueList.decorate(new ArrayList());
  280. List<String> months = SetUniqueList.decorate(new ArrayList());
  281. Date start = entity.getPlandatestart();
  282. Date end = entity.getPlandateend();
  283. Calendar c1 = Calendar.getInstance();
  284. c1.setTime(start);
  285. c1.set(Calendar.DAY_OF_MONTH,1);
  286. do{
  287. int year = c1.get(Calendar.YEAR);
  288. years.add(String.valueOf(year));
  289. months.add(DateUtil.formatDateTime(c1.getTime(),"yyyy-MM"));
  290. c1.add(Calendar.MONTH,1);
  291. }while(c1.getTime().getTime()<=end.getTime());
  292. entity.setMaintainYear(StringUtils.join(years,","));
  293. entity.setMaintainMonth(StringUtils.join(months,","));
  294. ProjecttaskEntity task = saveAndGenTask(entity);
  295. entity.setTaskId(task.getId());
  296. String timeId = entity.getMaintainPlanTimeId();
  297. MaintainPlanTimesEntity timesEntity = getEntity(MaintainPlanTimesEntity.class,timeId);
  298. timesEntity.setIsGenTask(Globals.YES);
  299. //发消息
  300. String owner = task.getOwner();
  301. TSUser ownerUser = getEntity(TSUser.class, owner);
  302. task.setWxMsgTitle(ownerUser.getRealName()+",您有一个维保计划已生成,请及时关注。");
  303. String serviceType = DictUtil.formatToTypeName(entity.getServicetypedetail(),"servicetypedetail");
  304. task.setWxTaskName(ownerUser.getRealName()+","+serviceType+"的维保计划已生成,请查收");
  305. String remark = "发起人:%s\r\n发起时间:%s";
  306. remark = String.format(remark,entity.getCreateName(), DateUtils.formatDate(entity.getCreateDate(),"yyyy-MM-dd HH:mm:ss" ));
  307. task.setWxRemark(remark);
  308. projecttaskService.sendMsg(task);
  309. }
  310. }
  311. @Override
  312. /**
  313. * maintainIdStr == null 则为删除支付信息
  314. */
  315. public void updatePaymentInfo(String maintainIdStr,String paymentid) throws Exception {
  316. String sql;
  317. if(StringUtils.isNotEmpty(maintainIdStr)) {
  318. maintainIdStr.replaceAll(",", "','");
  319. maintainIdStr = "'"+maintainIdStr + "'";
  320. sql = " update t_b_maintain_bill set paymentid =? where id in ("+maintainIdStr+")";
  321. }else {
  322. sql = " update t_b_maintain_bill set paymentid = null where paymentid =? ";
  323. }
  324. this.executeSql(sql, paymentid);
  325. }
  326. public void afterTaskFinish(ProjecttaskEntity task) {
  327. TaskResultEntity result ;
  328. List<TaskResultEntity> list = findByProperty(TaskResultEntity.class, "taskid", task.getId());
  329. if(list.size() > 0) {
  330. result = list.get(0);
  331. if(task.getTasktype().equals("maintainbill")) {
  332. MaintainBillEntity maintain = get(MaintainBillEntity.class, task.getSourceid());
  333. maintain.setScore(result.getTaskObjectScore());
  334. maintain.setValuate(result.getMemo());
  335. maintain.setBusistatus(Globals.MAINTAIN_STATUS_FINISH);
  336. maintain.setServicedate(new Date());
  337. }
  338. }
  339. }
  340. @Override
  341. public void checkNoContractPlan() {
  342. Calendar c =Calendar.getInstance();
  343. c.add(Calendar.MONTH,3);
  344. Date findDate = c.getTime();
  345. List<MaintainPlanEntity> list = billdao.findNoContractPlan(findDate);
  346. List<TSUser> cgjlList = useractivitiDataService.getUserByDepartIdAndRoleCode(null,Collections.singletonList(Globals.POSITION_TYPE_XZBJL));
  347. TSUser cgjl=null;
  348. if(cgjlList.size()>0){
  349. cgjl = cgjlList.get(0);
  350. }
  351. for(MaintainPlanEntity planEntity :list){
  352. String serviceType = DictUtil.formatToTypeName(planEntity.getServicetype(),"servicetypedetail");
  353. if(cgjl!=null){//采购经理发消息
  354. String first ="%s您好,%s%s计划已生成,但合同未签订,请及时续签。";
  355. first = String.format(first,cgjl.getRealName(),planEntity.getDepName(),serviceType);
  356. String remark = "提示";
  357. sendWxMessage(cgjl.getId(),first,first,remark,null);
  358. }
  359. List<TSUser> managerList = useractivitiDataService.getDepManager(planEntity.getDepartId());
  360. if(managerList.size()>0){
  361. TSUser manager = managerList.get(0);
  362. String first ="%s您好,预计%s进行%s,但维保合同未签订。";
  363. first = String.format(first,manager.getRealName(),DateUtils.formatDate(planEntity.getFirstTimeStart(),"yyyy-MM-dd"),serviceType);
  364. String remark = "点击查看";
  365. String host = ResourceUtil.getConfigByName(Globals.SERVER_WXMSG);
  366. String managerUrl = host+"/maintainPlanController.do?planViewMobile&id="+planEntity.getId();
  367. sendWxMessage(manager.getId(),first,first,remark,managerUrl);
  368. }
  369. }
  370. }
  371. @Override
  372. public void checkMatchContract() {
  373. Calendar c = Calendar.getInstance();
  374. c.set(Calendar.DAY_OF_WEEK,2);
  375. c.set(Calendar.HOUR_OF_DAY,0);
  376. c.set(Calendar.MINUTE,0);
  377. c.set(Calendar.SECOND,0);
  378. c.set(Calendar.MILLISECOND,0);
  379. c.add(Calendar.MILLISECOND,-1);
  380. Date end =c.getTime();
  381. c.add(Calendar.DAY_OF_MONTH,-7);
  382. c.add(Calendar.MILLISECOND,1);
  383. Date start = c.getTime();
  384. List<Map<String,Object>> list = billdao.findMatchContract(start,end);
  385. if(list.size()>0){
  386. List<TSUser> userList = useractivitiDataService.getUserByDepartIdAndRoleCode(null,Collections.singletonList(Globals.POSITION_TYPE_PZBZY));
  387. if(userList.size()>0){
  388. TSUser user = userList.get(0);
  389. String msg = "%s新签订%s合同,可能与该项目%s匹配,请关注。";
  390. for(Map<String,Object> map :list){
  391. String depName = StringUtil.getObject(map.get("dep_name"));
  392. String planName = StringUtil.getObject(map.get("planName"));
  393. String contractName = StringUtil.getObject(map.get("contractName"));
  394. String servicetype =StringUtil.getObject( map.get("servicetype"));
  395. servicetype = DictUtil.formatToTypeName(servicetype,"servicetypedetail");
  396. String first = String.format(msg,depName,servicetype,planName);
  397. String remark="";
  398. sendWxMessage(user.getId(),first,first,remark,null);
  399. }
  400. }
  401. }
  402. }
  403. private void sendWxMessage(String userId,String first,String keyword1,String remark,String url){
  404. Map<String, Object> userMsgParms = new HashMap<String, Object>();
  405. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  406. userMsgParms.put("first", first);
  407. userMsgParms.put("keyword1", keyword1);//工作内容
  408. userMsgParms.put("keyword2", format.format(new Date()));//创建时间
  409. userMsgParms.put("remark", remark);
  410. MessageWxTemplateConfig config = new MessageWxTemplateConfig();
  411. config.setTemplateId(XcglConstant.TEMPLATE_WXMSG_TASK);
  412. config.setUserMsgParms(userMsgParms);
  413. config.setShowUrl(url!=null);
  414. mMessageSendService.sendMessage(Collections.singletonList(userId),url,"","",config,new MMessageEntity.MessageSendWay[]{MMessageEntity.MessageSendWay.wx});
  415. }
  416. }