serviceorder.java 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166
  1. package restcontroller.webmanage.sale.serviceorder;
  2. import beans.data.BatchDeleteErr;
  3. import beans.datacontrllog.DataContrlLog;
  4. import beans.datatag.DataTag;
  5. import beans.datateam.DataTeam;
  6. import beans.parameter.Parameter;
  7. import beans.salearea.SaleArea;
  8. import com.alibaba.fastjson2.JSONArray;
  9. import com.alibaba.fastjson2.JSONObject;
  10. import common.BaseClass;
  11. import common.Controller;
  12. import common.YosException;
  13. import common.annotation.API;
  14. import common.annotation.CACHEING;
  15. import common.annotation.CACHEING_CLEAN;
  16. import common.crm.bean.warrantycard;
  17. import common.data.*;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.apache.cxf.configuration.security.DNConstraintsType;
  20. import org.glassfish.grizzly.utils.StringFilter;
  21. import restcontroller.R;
  22. import restcontroller.webmanage.executorService.Executor;
  23. import restcontroller.webmanage.sale.serviceorder.tools.HttpURLRest;
  24. import restcontroller.webmanage.sale.serviceorder.tools.VerificationManage;
  25. import restcontroller.webmanage.sale.workorder.workorder;
  26. import restcontroller.webmanage.sale.workorder.workpresetInfo;
  27. import utility.sms.Sms;
  28. import java.util.*;
  29. import java.util.regex.Pattern;
  30. /**
  31. * 服务申请单
  32. */
  33. @API(title = "服务申请单管理")
  34. public class serviceorder extends Controller {
  35. public static HashMap<String, VerificationManage> message_map = new HashMap<>();
  36. public serviceorder(JSONObject arg0) throws YosException {
  37. super(arg0);
  38. // TODO Auto-generated constructor stub
  39. }
  40. @API(title = "服务申请单新增更新", apiversion = R.ID20230206091403.v1.class)
  41. @CACHEING_CLEAN(apiversions = {R.ID20230206091603.v1.class, R.ID20230206091703.v1.class, R.ID20230206101303.v1.class, R.ID20230217100703.v1.class, R.ID20230217133003.v1.class})
  42. public String insertormodify_serviceorder() throws YosException {
  43. ArrayList<String> sqlList = new ArrayList<>();
  44. // 表名
  45. String tableName = "sa_serviceorder";
  46. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  47. String servicetype = content.getString("servicetype"); //服务分类
  48. if (sys_enterpriseid <= 0) {
  49. sys_enterpriseid = content.getLong("sys_enterpriseid");
  50. }
  51. String remarks = content.getStringValue("remarks");
  52. String class1 = content.getStringValue("class1");
  53. String class2 = content.getStringValue("class2");
  54. String reason = content.getStringValue("reason");
  55. String warrantystatus = content.getStringValue("warrantystatus");
  56. String province = content.getStringValue("province");
  57. String city = content.getStringValue("city");
  58. String county = content.getStringValue("county");
  59. String address = content.getStringValue("address");
  60. String scenecontact = content.getStringValue("scenecontact");
  61. String scenecontactrole = content.getStringValue("scenecontactrole");
  62. String scenecontactphonenumber = content.getStringValue("scenecontactphonenumber");
  63. String billdate = content.getStringValue("billdate");
  64. String begdate = content.getStringValue("begdate");
  65. String enddate = content.getStringValue("enddate");
  66. long saler_hrid = content.getLongValue("saler_hrid");
  67. boolean isonlinesales = content.getBooleanValue("isonlinesales");
  68. boolean isallowance = content.getBooleanValue("isallowance");
  69. long sys_enterpriseid_service = content.getLongValue("sys_enterpriseid_service");
  70. String sku = content.getStringValue("sku");
  71. String cardno = content.getStringValue("cardno");
  72. long itemid = content.getLongValue("itemid");
  73. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单新增");
  74. if (content.containsKey("servicetype")) {
  75. if (content.getString("servicetype").equals("安装")) {
  76. if (StringUtils.isBlank(sku)) {
  77. //return getErrReturnObject().setErrMsg("安装服务单需添加序列号").toString();
  78. }
  79. if (dbConnect.runSqlQuery("select * from sa_warrantycard where sku='" + sku + "' and siteid='" + siteid + "'").isNotEmpty()) {
  80. DataTag.createSystemTag(this, "sa_serviceorder", sa_serviceorderid, "重复安装");
  81. //return getErrReturnObject().setErrMsg("该序列号已安装,无法再次安装").toString();
  82. }
  83. }
  84. }
  85. String initiator="";
  86. Rows userrows = dbConnect.runSqlQuery("select t2.usertype,t1.phonenumber from sys_users t1 inner join sys_usersite t2 on t1.userid = t2.userid where t2.siteid = '" + siteid + "' and t1.userid=" + userid);
  87. long usertype = 0;
  88. if (userrows.isNotEmpty()) {
  89. usertype = userrows.get(0).getLong("usertype");
  90. }
  91. if(usertype==99){
  92. initiator="消费者";
  93. }else if(usertype==21 || usertype==22){
  94. initiator="经销商";
  95. }else{
  96. initiator="总部";
  97. }
  98. if (sa_serviceorderid <= 0 || dbConnect.runSqlQuery(
  99. "select sa_serviceorderid from sa_serviceorder where sa_serviceorderid=" + sa_serviceorderid)
  100. .isEmpty()) {
  101. sa_serviceorderid = createTableID(tableName);
  102. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  103. if (saler_hrid != 0) {
  104. sqlFactory.addParameter("saler_hrid", saler_hrid);
  105. } else {
  106. Rows hrRows = dbConnect.runSqlQuery("select hrid from sys_enterprise_tradefield where siteid='" + siteid + "' and sys_enterpriseid=" + sys_enterpriseid);
  107. if (hrRows.isEmpty()) {
  108. sqlFactory.addParameter("saler_hrid", saler_hrid);
  109. } else {
  110. sqlFactory.addParameter("saler_hrid", hrRows.get(0).getLong("hrid"));
  111. }
  112. }
  113. sqlList.add(
  114. DataContrlLog.createLog(this, "sa_serviceorder", sa_serviceorderid, "新增", "服务申请单新增成功").getSQL());
  115. } else {
  116. Rows rows = dbConnect.runSqlQuery(
  117. "SELECT status,sys_enterpriseid,sa_orderid from sa_serviceorder WHERE sa_serviceorderid = "
  118. + sa_serviceorderid);
  119. if (rows.isNotEmpty()) {
  120. if (rows.get(0).getString("status").equals("新建") || rows.get(0).getString("status").equals("待分配")) {
  121. sqlFactory = new SQLFactory(this, "服务申请单更新");
  122. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  123. sqlList.add(DataContrlLog.createLog(this, "sa_serviceorder", sa_serviceorderid, "更新", "服务申请单更新成功")
  124. .getSQL());
  125. } else {
  126. return getErrReturnObject().setErrMsg("该状态下无法编辑").toString();
  127. }
  128. } else {
  129. return getErrReturnObject().setErrMsg("该服务申请单不存在").toString();
  130. }
  131. }
  132. sqlFactory.addParameter("saler_hrid", saler_hrid);
  133. sqlFactory.addParameter("servicetype", servicetype);
  134. sqlFactory.addParameter("siteid", siteid);
  135. sqlFactory.addParameter("userid", userid);
  136. sqlFactory.addParameter("username", username);
  137. sqlFactory.addParameter("sa_serviceorderid", sa_serviceorderid);
  138. sqlFactory.addParameter("sa_orderid", 0);
  139. sqlFactory.addParameter("remarks", remarks);
  140. sqlFactory.addParameter("class1", class1);
  141. sqlFactory.addParameter("class2", class2);
  142. sqlFactory.addParameter("reason", reason);
  143. sqlFactory.addParameter("province", province);
  144. sqlFactory.addParameter("city", city);
  145. sqlFactory.addParameter("county", county);
  146. sqlFactory.addParameter("address", address);
  147. sqlFactory.addParameter("scenecontact", scenecontact);
  148. sqlFactory.addParameter("scenecontactrole", scenecontactrole);
  149. sqlFactory.addParameter("scenecontactphonenumber", scenecontactphonenumber);
  150. // 服务申请单号createBillCode("serviceorder")
  151. sqlFactory.addParameter("billno", createBillCode("serviceorder"));
  152. sqlFactory.addParameter("billdate", billdate.equals("") ? "null" : billdate);
  153. sqlFactory.addParameter("begdate", begdate.equals("") ? "null" : begdate);
  154. sqlFactory.addParameter("enddate", enddate.equals("") ? "null" : enddate);
  155. sqlFactory.addParameter("name", content.getStringValue("name"));
  156. sqlFactory.addParameter("phonenumber", content.getStringValue("phonenumber"));
  157. sqlFactory.addParameter("sa_customersid", content.getStringValue("sa_customersid"));
  158. sqlFactory.addParameter("isonlinesales",isonlinesales);
  159. sqlFactory.addParameter("isallowance",isallowance);
  160. sqlFactory.addParameter("initiator",initiator);
  161. sqlFactory.addParameter("sys_enterpriseid_service",sys_enterpriseid_service);
  162. sqlList.add(sqlFactory.getSQL());
  163. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_serviceorderitems");
  164. insertSQL.setUniqueid(createTableID("sa_serviceorderitems"));
  165. insertSQL.setSiteid(siteid);
  166. insertSQL.setValue("sa_serviceorderid", sa_serviceorderid);
  167. insertSQL.setValue("itemid", itemid);
  168. insertSQL.setValue("sku", sku);
  169. insertSQL.setValue("cardno", cardno);
  170. insertSQL.setValue("reason", reason);
  171. insertSQL.setValue("warrantystatus", warrantystatus);
  172. sqlList.add(insertSQL.getSQL());
  173. dbConnect.runSqlUpdate("delete from sa_serviceorderitems where siteid='" + siteid + "' and sa_serviceorderid=" + sa_serviceorderid);
  174. dbConnect.runSqlUpdate(sqlList);
  175. content.put("sa_serviceorderid", sa_serviceorderid);
  176. return queryserviceorderMain();
  177. }
  178. @API(title = "更新是否补贴", apiversion = R.ID2025121517474303.v1.class)
  179. public String cheangeisallowance() throws YosException {
  180. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  181. boolean isallowance = content.getBooleanValue("isallowance");
  182. dbConnect.runSqlUpdate("update sa_serviceorder set isallowance="+isallowance+" where sa_serviceorderid="+sa_serviceorderid);
  183. return getSucReturnObject().toString();
  184. }
  185. /**
  186. * 服务分类查询
  187. **/
  188. @API(title = "服务分类查询", apiversion = R.ID20230206112003.v1.class)
  189. public String servicetypeList() throws YosException {
  190. Rows rows = new Rows();
  191. Row row1 = new Row();
  192. row1.put("value", "维修");
  193. Row row2 = new Row();
  194. row2.put("value", "安装");
  195. Row row3 = new Row();
  196. row3.put("value", "清洗");
  197. rows.add(row1);
  198. rows.add(row2);
  199. rows.add(row3);
  200. return getSucReturnObject().setData(rows).toString();
  201. }
  202. @API(title = "可选择序列号列表查询", apiversion = R.ID2025082210142103.v1.class)
  203. @CACHEING
  204. public String queryskuList() throws YosException {
  205. if (content.containsKey("sys_enterpriseid")) {
  206. sys_enterpriseid = content.getLong("sys_enterpriseid");
  207. }
  208. /*
  209. * 过滤条件设置
  210. */
  211. StringBuffer where = new StringBuffer(" 1=1 ");
  212. if (content.containsKey("where")) {
  213. JSONObject whereObject = content.getJSONObject("where");
  214. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  215. where.append(" and(");
  216. where.append("t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  217. where.append("or t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  218. where.append("or t1.sku like'%").append(whereObject.getString("condition")).append("%' ");
  219. where.append(")");
  220. }
  221. if (whereObject.containsKey("sku") && !"".equals(whereObject.getString("sku"))) {
  222. where.append(" and(");
  223. where.append("t1.sku ='").append(whereObject.getString("sku")).append("' ");
  224. where.append(")");
  225. }
  226. if (whereObject.containsKey("isvoid") && !"".equals(whereObject.getString("isvoid"))) {
  227. where.append(" and(");
  228. where.append("t1.isvoid ='").append(whereObject.getString("isvoid")).append("' ");
  229. where.append(")");
  230. }
  231. if (whereObject.containsKey("isinstalled") && !"".equals(whereObject.getString("isinstalled"))) {
  232. where.append(" and(");
  233. where.append(" case when ifnull(t1.cardno,'')='' then '未安装' else '已安装' end ='").append(whereObject.getString("isinstalled")).append("' ");
  234. where.append(")");
  235. }
  236. }
  237. SQLFactory sqlFactory = new SQLFactory(this, "序列号查询");
  238. sqlFactory.addParameter_SQL("where", where);
  239. sqlFactory.addParameter("siteid", siteid);
  240. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  241. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_site_parameter", "sys_site_parameterid");
  242. querySQL.setTableAlias("t0");
  243. querySQL.addJoinTable(JOINTYPE.right, sqlFactory, "t1", "t0.siteid='111'","*");
  244. querySQL.setPage(pageSize, pageNumber);
  245. Rows rows = querySQL.query();
  246. // 默认商品图片
  247. Rows defaultImageRows = beans.Item.Item.getItemdefaultImage(this);
  248. // 附件
  249. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  250. RowsMap attRowsMap = getAttachmentUrl("plm_item", ids);
  251. RowsMap warrantycardRowsMap = SQLFactory.createQuerySQL(this, "sa_warrantycard", "sku","name", "phonenumber","address","sa_customersid","province","city","county").setWhere("sku", rows.toArrayList("sku")).query().toRowsMap("sku");
  252. for (Row row : rows) {
  253. if (attRowsMap.getOrDefault(row.getString("itemid"), new Rows()).isNotEmpty()) {
  254. row.put("attinfos", attRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  255. } else {
  256. row.put("attinfos", defaultImageRows);
  257. }
  258. String sku = row.getString("sku");
  259. if (warrantycardRowsMap.containsKey(sku) && warrantycardRowsMap.get(sku).isNotEmpty()) {
  260. Row warrantycardRow = warrantycardRowsMap.get(sku).get(0);
  261. row.put("name", warrantycardRow.getString("name"));
  262. row.put("phonenumber", warrantycardRow.getString("phonenumber"));
  263. row.put("address", warrantycardRow.getString("address"));
  264. row.put("sa_customersid", warrantycardRow.getLong("sa_customersid"));
  265. row.put("province", warrantycardRow.getString("province"));
  266. row.put("city", warrantycardRow.getString("city"));
  267. row.put("county", warrantycardRow.getString("county"));
  268. }else{
  269. row.put("name", "");
  270. row.put("phonenumber", "");
  271. row.put("address","");
  272. row.put("sa_customersid", "");
  273. row.put("province", "");
  274. row.put("city", "");
  275. row.put("county", "");
  276. }
  277. }
  278. return getSucReturnObject().setData(rows).toString();
  279. }
  280. @API(title = "可选择订单列表查询", apiversion = R.ID20230206091503.v1.class)
  281. @CACHEING
  282. public String queryCheckOrderList() throws YosException {
  283. if (content.containsKey("sys_enterpriseid")) {
  284. sys_enterpriseid = content.getLong("sys_enterpriseid");
  285. }
  286. /*
  287. * 过滤条件设置
  288. */
  289. StringBuffer where = new StringBuffer(" 1=1 ");
  290. // if(content.getBooleanValue("istool")) {
  291. // where.append(" and t1.type ='工具借用单' ");
  292. // }else {
  293. // where.append(" and t1.type !='工具借用单' ");
  294. // }
  295. if (content.containsKey("where")) {
  296. JSONObject whereObject = content.getJSONObject("where");
  297. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  298. where.append(" and(");
  299. where.append("t1.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  300. where.append(")");
  301. }
  302. if (whereObject.containsKey("sonum") && !"".equals(whereObject.getString("sonum"))) {
  303. where.append(" and t1.sonum ='").append(whereObject.getString("sonum")).append("' ");
  304. }
  305. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  306. where.append(" and t1.checkdate >='").append(whereObject.getString("begindate")).append("' ");
  307. }
  308. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  309. where.append(" and t1.checkdate <='").append(whereObject.getString("enddate")).append("' ");
  310. }
  311. }
  312. // String hrid = content.getString("hrid");
  313. SQLFactory sqlFactory = new SQLFactory(this, "审核订单列表查询");
  314. sqlFactory.addParameter_SQL("where", where);
  315. sqlFactory.addParameter("siteid", siteid);
  316. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  317. // Rows rows = dbConnect.runSqlQuery(sqlFactory);
  318. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_site_parameter", "sys_site_parameterid");
  319. querySQL.setTableAlias("t0");
  320. querySQL.addJoinTable(JOINTYPE.right, sqlFactory, "t1", "t0.siteid='111'", "*");
  321. querySQL.setPage(pageSize, pageNumber);
  322. Rows rows = querySQL.query();
  323. return getSucReturnObject().setData(rows).toString();
  324. }
  325. @API(title = "服务申请单详情", apiversion = R.ID20230206091603.v1.class)
  326. @CACHEING
  327. public String queryserviceorderMain() throws YosException {
  328. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  329. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单详情查询");
  330. sqlFactory.addParameter("sa_serviceorderid", sa_serviceorderid);
  331. sqlFactory.addParameter("siteid", siteid);
  332. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  333. ArrayList<Long> ids = rows.toArrayList("sa_serviceorderid", new ArrayList<>());
  334. HashMap<Long, ArrayList<String>> tagRows = DataTag.queryTag(this, "sa_serviceorder", ids, true);
  335. for (Row row : rows) {
  336. if (tagRows.get(row.getLong("sa_serviceorderid")) != null) {
  337. row.put("tag", tagRows.get(row.getLong("sa_serviceorderid")));
  338. } else {
  339. row.put("tag", new ArrayList<String>());
  340. }
  341. }
  342. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  343. // if(!row.isEmpty()) {
  344. // //服务申请单关联物料查询
  345. // SQLFactory sqlFactorytitem = new SQLFactory(this, "服务申请单关联物料查询");
  346. // sqlFactorytitem.addParameter("sa_serviceorderid", sa_serviceorderid);
  347. // sqlFactorytitem.addParameter("siteid", siteid);
  348. // row.put("titems",dbConnect.runSqlQuery(sqlFactorytitem));
  349. // //服务申请单关联工单查询
  350. // SQLFactory sqlFactoryworkorder = new SQLFactory(this, "服务申请单关联工单查询");
  351. // sqlFactoryworkorder.addParameter("sa_serviceorderid", sa_serviceorderid);
  352. // sqlFactoryworkorder.addParameter("siteid", siteid);
  353. // row.put("workorder",dbConnect.runSqlQuery(sqlFactoryworkorder));
  354. // }
  355. Rows backreasonRows = dbConnect.runSqlQuery("select backreason from sys_dataextend where ownertable='sa_serviceorder' and siteid='" + siteid + "' and backreason is not null and backreason <>'' and ownerid=" + sa_serviceorderid + " order by changedate desc");
  356. if (!backreasonRows.isEmpty()) {
  357. row.put("backreason", backreasonRows.get(0).getString("backreason"));
  358. } else {
  359. row.put("backreason", "");
  360. }
  361. return getSucReturnObject().setData(row).toString();
  362. }
  363. @API(title = "服务申请单详情(不验证token))", apiversion = R.ID20230217133003.v1.class, accesstoken = false)
  364. public String queryserviceorderMainWithoutToken() throws YosException {
  365. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  366. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单详情查询2");
  367. sqlFactory.addParameter("sa_serviceorderid", sa_serviceorderid);
  368. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  369. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  370. if (!row.isEmpty()) {
  371. //服务申请单关联物料查询
  372. SQLFactory sqlFactorytitem = new SQLFactory(this, "服务申请单关联物料查询");
  373. sqlFactorytitem.addParameter("sa_serviceorderid", sa_serviceorderid);
  374. row.put("titems", dbConnect.runSqlQuery(sqlFactorytitem));
  375. //服务申请单关联工单查询
  376. SQLFactory sqlFactoryworkorder = new SQLFactory(this, "服务申请单关联工单查询");
  377. sqlFactoryworkorder.addParameter("sa_serviceorderid", sa_serviceorderid);
  378. row.put("workorder", dbConnect.runSqlQuery(sqlFactoryworkorder));
  379. }
  380. Rows backreasonRows = dbConnect.runSqlQuery("select backreason from sys_dataextend where ownertable='sa_serviceorder' and backreason is not null and backreason <>'' and ownerid=" + sa_serviceorderid + " order by changedate desc");
  381. if (!backreasonRows.isEmpty()) {
  382. row.put("backreason", backreasonRows.get(0).getString("backreason"));
  383. } else {
  384. row.put("backreason", "");
  385. }
  386. return getSucReturnObject().setData(row).toString();
  387. }
  388. @API(title = "服务申请单关联工单查询", apiversion = R.ID20230207154203.v1.class)
  389. @CACHEING
  390. public String queryserviceorderWorkorderList() throws YosException {
  391. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  392. StringBuffer where = new StringBuffer(" 1=1 ");
  393. // if (content.containsKey("where")) {
  394. // JSONObject whereObject = content.getJSONObject("where");
  395. // if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  396. // where.append(" and(");
  397. // where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  398. // where.append("or t3.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  399. // where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  400. // where.append("or t1.reason like'%").append(whereObject.getString("condition")).append("%' ");
  401. // where.append(")");
  402. // }
  403. // if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  404. // where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  405. // }
  406. // }
  407. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单关联工单查询");
  408. sqlFactory.addParameter("siteid", siteid);
  409. sqlFactory.addParameter("sa_serviceorderid", sa_serviceorderid);
  410. sqlFactory.addParameter_SQL("where", where);
  411. // Rows rows = dbConnect.runSqlQuery(sqlFactory);
  412. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_site_parameter", "sys_site_parameterid");
  413. querySQL.setTableAlias("t0");
  414. querySQL.addJoinTable(JOINTYPE.right, sqlFactory, "t1", "t0.siteid='111'", "*");
  415. querySQL.setPage(pageSize, pageNumber);
  416. Rows rows = querySQL.query();
  417. return getSucReturnObject().setData(rows).toString();
  418. }
  419. @API(title = "查询服务申请单列表", apiversion = R.ID20230206091703.v1.class)
  420. @CACHEING
  421. public String queryserviceorderList() throws YosException {
  422. StringBuffer where = new StringBuffer(" 1=1 ");
  423. if (content.containsKey("where")) {
  424. JSONObject whereObject = content.getJSONObject("where");
  425. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  426. where.append(" and(");
  427. where.append("t1.servicetype like'%").append(whereObject.getString("condition")).append("%' ");
  428. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  429. where.append("or t1.reason like'%").append(whereObject.getString("condition")).append("%' ");
  430. where.append("or t1.class1 like'%").append(whereObject.getString("condition")).append("%' ");
  431. where.append(")");
  432. }
  433. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  434. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  435. }
  436. if (whereObject.containsKey("class1") && !"".equals(whereObject.getString("class1"))) {
  437. where.append(" and t1.class1 ='").append(whereObject.getString("class1")).append("' ");
  438. }
  439. if (whereObject.containsKey("servicetype") && !"".equals(whereObject.getString("servicetype"))) {
  440. where.append(" and t1.servicetype ='").append(whereObject.getString("servicetype")).append("' ");
  441. }
  442. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  443. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  444. }
  445. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  446. where.append(" and t1.submitdate >='").append(whereObject.getString("begindate")).append("'");
  447. }
  448. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  449. where.append(" and t1.submitdate <='").append(whereObject.getString("enddate")).append("'");
  450. }
  451. if (whereObject.containsKey("submitdate") && !"".equals(whereObject.getString("submitdate"))) {
  452. where.append(" and t1.submitdate >='").append(whereObject.getString("submitdate")).append("'");
  453. where.append(" and t1.submitdate <='").append(getDate_Str(whereObject.getDate("submitdate"), 1)).append("'");
  454. }
  455. if (whereObject.containsKey("phonenumber") && !"".equals(whereObject.getString("phonenumber"))) {
  456. where.append(" and t1.scenecontactphonenumber ='").append(whereObject.getString("phonenumber")).append("'");
  457. }
  458. if (whereObject.containsKey("customerphonenumber") && !"".equals(whereObject.getString("customerphonenumber"))) {
  459. where.append(" and t1.phonenumber ='").append(whereObject.getString("customerphonenumber")).append("'");
  460. }
  461. if (whereObject.containsKey("sa_customersid") && !"".equals(whereObject.getString("sa_customersid"))) {
  462. where.append(" and t1.sa_customersid ='").append(whereObject.getString("sa_customersid")).append("'");
  463. }
  464. if (whereObject.containsKey("isonlinesales") && !"".equals(whereObject.getString("isonlinesales"))) {
  465. where.append(" and t1.isonlinesales ='").append(whereObject.getString("isonlinesales")).append("' ");
  466. }
  467. if (whereObject.containsKey("createuserid") && !"".equals(whereObject.getString("createuserid"))) {
  468. where.append(" and t1.createuserid ='").append(whereObject.getString("createuserid")).append("'");
  469. }
  470. if (whereObject.getBooleanValue("todaysubmitCount")) {
  471. where.append(" and t1.status != '新建' and DATE(t1.submitdate) = CURDATE() ");
  472. }
  473. if (whereObject.getBooleanValue("todayazsubmitCount")) {
  474. where.append(" and t1.status != '新建' and t10.type='安装' and DATE(t1.submitdate) = CURDATE() ");
  475. }
  476. if (whereObject.getBooleanValue("todaywxsubmitCount")) {
  477. where.append(" and t1.status != '新建' and t10.type='维修' and DATE(t1.submitdate) = CURDATE() ");
  478. }
  479. if (whereObject.getBooleanValue("todayqxsubmitCount")) {
  480. where.append(" and t1.status != '新建' and t10.type='清洗' and DATE(t1.submitdate) = CURDATE() ");
  481. }
  482. if (whereObject.getBooleanValue("tobeassignedCount")) {
  483. where.append(" and t1.status = '待分配' ");
  484. }
  485. if (whereObject.getBooleanValue("tobeassignedCount24")) {
  486. where.append(" and t1.status = '待分配' and t1.submitdate < DATE_SUB(NOW(), INTERVAL 24 HOUR) ");
  487. }
  488. if (whereObject.getBooleanValue("pendingCount")) {
  489. where.append(" and t1.status = '待受理' ");
  490. }
  491. if (whereObject.getBooleanValue("pendingCount24")) {
  492. where.append(" and t1.status = '待受理' and t1.allocationdate < DATE_SUB(NOW(), INTERVAL 24 HOUR) ");
  493. }
  494. if (whereObject.getBooleanValue("refuseacceptCount")) {
  495. where.append(" and t1.status = '拒绝受理' ");
  496. }
  497. if (whereObject.getBooleanValue("tobeservedCount")) {
  498. where.append(" and t1.status = '待服务' ");
  499. }
  500. if (whereObject.getBooleanValue("inserviceCount")) {
  501. where.append(" and t1.status = '服务中' ");
  502. }
  503. }
  504. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单列表查询");
  505. sqlFactory.addParameter("siteid", siteid);
  506. sqlFactory.addParameter_SQL("where", where);
  507. // Rows rows = dbConnect.runSqlQuery(sqlFactory);
  508. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_site_parameter", "sys_site_parameterid");
  509. querySQL.setTableAlias("t0");
  510. querySQL.addJoinTable(JOINTYPE.right, sqlFactory, "t1", "t0.siteid='111'", "*");
  511. querySQL.setPage(pageSize, pageNumber);
  512. Rows rows = querySQL.query();
  513. ArrayList<Long> ids = rows.toArrayList("sa_serviceorderid", new ArrayList<>());
  514. HashMap<Long, ArrayList<String>> tagRows = DataTag.queryTag(this, "sa_serviceorder", ids, true);
  515. for (Row row : rows) {
  516. if (tagRows.get(row.getLong("sa_serviceorderid")) != null) {
  517. row.put("tag", tagRows.get(row.getLong("sa_serviceorderid")));
  518. } else {
  519. row.put("tag", new ArrayList<String>());
  520. }
  521. }
  522. return getSucReturnObject().setData(rows).toString();
  523. }
  524. @API(title = "服务申请单状态统计", apiversion = R.ID2025111809442603.v1.class)
  525. public String queryserviceorderStatusList() throws YosException {
  526. SQLFactory sqlFactory2 = new SQLFactory(this, "服务申请单状态统计");
  527. sqlFactory2.addParameter("siteid", siteid);
  528. sqlFactory2.addParameter_SQL("where", " 1=1 ");
  529. Rows rows_total = dbConnect.runSqlQuery(sqlFactory2.getSQL());
  530. return getSucReturnObject().setData(rows_total).toString();
  531. }
  532. @API(title = "查询服务申请单列表(不验证token)", apiversion = R.ID20230217100703.v1.class, accesstoken = false)
  533. public String queryserviceorderListWithoutToken() throws YosException {
  534. StringBuffer where = new StringBuffer(" 1=1 ");
  535. boolean isadmin = content.getBooleanValue("isadmin");
  536. if (!isadmin) {
  537. if (usertype == 1) {
  538. ArrayList<Long> sa_saleareaidsList = new ArrayList<>();
  539. sa_saleareaidsList.addAll(userInfo.getSaleAreaIds());
  540. sa_saleareaidsList.addAll(SaleArea.getSubSaleAreaIds(this, userInfo.getSaleAreaIds()));
  541. String where2 = " and t1.sys_enterpriseid in (select sys_enterpriseid from sys_enterprise_tradefield where siteid='" + siteid + "' and sa_saleareaid in " + sa_saleareaidsList + ")";
  542. where2 = where2.replace("[", "(").replace("]", ")");
  543. where.append(where2);
  544. } else if (usertype == 21 || usertype == 22) {
  545. where.append(" and t1.sys_enterpriseid=" + sys_enterpriseid + " ");
  546. }
  547. }
  548. if (content.containsKey("where")) {
  549. JSONObject whereObject = content.getJSONObject("where");
  550. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  551. where.append(" and(");
  552. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  553. where.append("or t3.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  554. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  555. where.append("or t1.reason like'%").append(whereObject.getString("condition")).append("%' ");
  556. where.append(")");
  557. }
  558. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  559. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  560. }
  561. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  562. where.append(" and t1.submitdate >='").append(whereObject.getString("begindate")).append("'");
  563. }
  564. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  565. where.append(" and t1.submitdate <='").append(whereObject.getString("enddate")).append("'");
  566. }
  567. if (whereObject.containsKey("phonenumber") && !"".equals(whereObject.getString("phonenumber"))) {
  568. where.append(" and t1.scenecontactphonenumber ='").append(whereObject.getString("phonenumber")).append("'");
  569. }
  570. }
  571. SQLFactory sqlFactory = new SQLFactory(this, "服务申请单列表查询2");
  572. //sqlFactory.addParameter("siteid", siteid);
  573. sqlFactory.addParameter_SQL("where", where);
  574. // Rows rows = dbConnect.runSqlQuery(sqlFactory);
  575. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_site_parameter", "sys_site_parameterid");
  576. querySQL.setTableAlias("t0");
  577. querySQL.addJoinTable(JOINTYPE.right, sqlFactory, "t1", "t0.siteid='111'", "*");
  578. querySQL.setPage(pageSize, pageNumber);
  579. Rows rows = querySQL.query();
  580. return getSucReturnObject().setData(rows).toString();
  581. }
  582. @API(title = "工单模板查询", apiversion = R.ID20230206155803.v1.class)
  583. @CACHEING
  584. public String queryworkerordertemplate() throws YosException {
  585. Rows rows = dbConnect.runSqlQuery(
  586. "select sa_workorder_templateid,name,type from sa_workorder_template where siteid='" + siteid + "' and isused=1");
  587. return getSucReturnObject().setData(rows).toString();
  588. }
  589. @API(title = "服务申请单转工单", apiversion = R.ID20230207091003.v1.class)
  590. @CACHEING_CLEAN(apiversions = {R.ID20230206091603.v1.class, R.ID20230206091703.v1.class, R.ID20230206101303.v1.class, R.ID20230208140103.v1.class, R.ID20230208140203.v1.class,
  591. R.ID20230209091103.v1.class, R.ID20230207154203.v1.class, R.ID20230217100703.v1.class, R.ID20230217133003.v1.class})
  592. public String serviceorderToWorkorder() throws YosException {
  593. Long sa_serviceorderid = content.getLong("sa_serviceorderid");
  594. String type = content.getString("type");
  595. JSONArray projectlearders = content.getJSONArray("projectlearders");
  596. Long sa_workorder_templateid = content.getLongValue("sa_workorder_templateid");
  597. Rows rows = dbConnect
  598. .runSqlQuery("select * from sa_serviceorder where sa_serviceorderid ='"
  599. + sa_serviceorderid + "' and siteid='" + siteid + "'");
  600. Rows workorderRows = dbConnect
  601. .runSqlQuery("select sa_workorderid,status,billno,sa_serviceorderid from sa_workorder where sa_serviceorderid ='"
  602. + sa_serviceorderid + "' and siteid='" + siteid + "'");
  603. if (rows.isEmpty()) {
  604. return getErrReturnObject().setErrMsg("此服务单不存在").toString();
  605. } else {
  606. if (!rows.get(0).getString("status").equals("待受理")) {
  607. return getErrReturnObject().setErrMsg("非待受理状态无法生成工单").toString();
  608. }
  609. Rows serviceorderitems = dbConnect.runSqlQuery("select sku from sa_serviceorderitems where sa_serviceorderid=" + sa_serviceorderid);
  610. if (serviceorderitems.isNotEmpty() && type.equals("安装")) {
  611. if (StringUtils.isNotBlank(serviceorderitems.get(0).getString("sku"))) {
  612. if (dbConnect.runSqlQuery("select * from sa_warrantycard where sku='" + serviceorderitems.get(0).getString("sku") + "' and siteid='" + siteid + "' and isvoid=0").isNotEmpty()) {
  613. return getErrReturnObject().setErrMsg("该序列号已安装,无法再次安装").toString();
  614. }
  615. }
  616. }
  617. }
  618. if (!workorderRows.isEmpty()) {
  619. for (Row row : workorderRows) {
  620. if (row.getString("type").equals(type) && !row.getString("status").equals("作废")) {
  621. return getErrReturnObject().setErrMsg("已存在" + type + "类型的工单,无法继续生成此类型的工单").toString();
  622. }
  623. }
  624. }
  625. ArrayList<String> sqlList = new ArrayList<>();
  626. long sa_workorderid = createTableID("sa_workorder");
  627. SQLFactory sqlFactory = new SQLFactory(this, "服务工单新增");
  628. String billno = createBillCode("workorder");
  629. sqlFactory.addParameter("siteid", siteid);
  630. sqlFactory.addParameter("type", type);
  631. sqlFactory.addParameter("sa_serviceorderid", sa_serviceorderid);
  632. sqlFactory.addParameter("billno", billno);
  633. sqlFactory.addParameter("sys_enterpriseid", rows.get(0).getString("sys_enterpriseid"));
  634. sqlFactory.addParameter("sa_workorderid", sa_workorderid);
  635. sqlFactory.addParameter("reason", rows.get(0).getString("reason"));
  636. sqlFactory.addParameter("address", rows.get(0).getString("address"));
  637. sqlFactory.addParameter("isouritem", 1);
  638. sqlFactory.addParameter("startdate", StringUtils.isBlank(rows.get(0).getString("begdate")) ? (StringUtils.isBlank(rows.get(0).getString("billdate")) ? "NULL" : rows.get(0).getString("billdate")) : rows.get(0).getString("begdate"));
  639. sqlFactory.addParameter("scenecontact", rows.get(0).getString("scenecontact"));
  640. sqlFactory.addParameter("scenecontactrole", rows.get(0).getString("scenecontactrole"));
  641. sqlFactory.addParameter("scenecontactphonenumber", rows.get(0).getString("scenecontactphonenumber"));
  642. sqlFactory.addParameter("remarks", rows.get(0).getString("remarks"));
  643. sqlFactory.addParameter("status", "待接单");
  644. sqlFactory.addParameter("userid", userid);
  645. sqlFactory.addParameter("username", username);
  646. sqlFactory.addParameter("sa_workorder_templateid", sa_workorder_templateid);
  647. SQLFactory factory = new SQLFactory(this, "查询订单收货日期");
  648. factory.addParameter("sa_orderid", rows.get(0).getLong("sa_orderid"));
  649. factory.addParameter("siteid", siteid);
  650. Rows rowsreceive = dbConnect.runSqlQuery(factory.getSQL());
  651. if (!rowsreceive.isEmpty()) {
  652. //System.out.println(888);
  653. Date receivedate = rowsreceive.get(0).getDate("receivedate");
  654. Calendar calendar = Calendar.getInstance();
  655. calendar.add(Calendar.YEAR, -2);
  656. Date date = calendar.getTime();
  657. if (date.before(receivedate)) {
  658. sqlFactory.addParameter("inqualityguaranteeperiod", 1);
  659. } else {
  660. sqlFactory.addParameter("inqualityguaranteeperiod", 0);
  661. }
  662. } else {
  663. sqlFactory.addParameter("inqualityguaranteeperiod", 0);
  664. }
  665. sqlList.add("delete from sa_workorder_node where sa_workorderid=" + sa_workorderid);
  666. sqlList.addAll(getAddWorkorderNodeSql(sa_workorder_templateid, sa_workorderid));
  667. sqlList.add(sqlFactory.getSQL());
  668. sqlList.add("update sa_serviceorder set status='待服务' where sa_serviceorderid=" + sa_serviceorderid);
  669. if (projectlearders != null && !projectlearders.isEmpty()) {
  670. sqlList.add("delete from sys_datateam where ownertable='sa_workorder' and ownerid="
  671. + sa_workorderid + " and siteid='" + siteid + "'");
  672. for (Object obj : projectlearders) {
  673. sqlList.addAll(DataTeam.createTeamSQL(this, "sa_workorder", sa_workorderid, (int) obj));
  674. }
  675. }
  676. dbConnect.runSqlUpdate(sqlList);
  677. //发送短信
  678. Rows serviceorderRows = dbConnect.runSqlQuery("select t2.enterprisename,t1.billno,t1.submitby,t1.remarks from sa_serviceorder t1 left join sys_enterprise t2 on t1.sys_enterpriseid=t2.sys_enterpriseid and t1.siteid=t2.siteid where t1.sa_serviceorderid ='" + sa_serviceorderid + "' and t1.siteid='" + siteid + "'");
  679. for (Object obj : projectlearders) {
  680. int projectlearder = (int) obj;
  681. Rows workersRows = dbConnect.runSqlQuery("select t3.phonenumber from sys_hr t1 left join sys_users t3 on t1.userid = t3.userid left join sys_hr t4 on t1.siteid = t4.siteid and t1.reporthrid = t4.hrid where t1.siteid = '" + siteid + "' and t1.isworker=1 and t1.userid=" + projectlearder);
  682. if (!workersRows.isEmpty()) {
  683. if (StringUtils.isNotBlank(workersRows.get(0).getString("phonenumber"))) {
  684. Sms sms = new Sms();
  685. sms.sendout(Sms.SmsType.Notice, siteid, workersRows.get(0).getString("phonenumber"), "工单号:" + billno + "已指派请处理,客户名称:" + (StringUtils.isBlank(serviceorderRows.get(0).getString("enterprisename")) ? "" : serviceorderRows.get(0).getString("enterprisename"))
  686. + ",提交人:" + serviceorderRows.get(0).getString("submitby") + ",备注:" + serviceorderRows.get(0).getString("remarks"));
  687. }
  688. }
  689. }
  690. return getSucReturnObject().setData(sa_workorderid).toString();
  691. }
  692. @API(title = "重新指派工单", apiversion = R.ID2025101710510903.v1.class)
  693. @CACHEING_CLEAN(apiversions = {serviceorder.class, workorder.class, restcontroller.sale.serviceorder.serviceorder.class})
  694. public String reAssigningWorkorder() throws YosException {
  695. Long sa_workorderid = content.getLong("sa_workorderid");
  696. JSONArray projectlearders = content.getJSONArray("projectlearders");
  697. boolean ismanage = content.getBooleanValue("ismanage");
  698. ArrayList<String> sqlList = new ArrayList<>();
  699. Rows rows = dbConnect
  700. .runSqlQuery("select status,billno from sa_workorder where sa_workorderid ='"
  701. + sa_workorderid + "' and siteid='" + siteid + "'");
  702. for (Row row : rows) {
  703. if (row.getString("status").equals("已完工")) {
  704. return getErrReturnObject().setErrMsg("单号为:【" + row.getString("billno") + "】的工单为已完工状态,无法重新指派工单")
  705. .toString();
  706. }
  707. }
  708. if (!ismanage) {
  709. Rows datateamrows = dbConnect.runSqlQuery("select * from sys_datateam where ownertable='sa_workorder' and ownerid="
  710. + sa_workorderid + " and siteid='" + siteid + "'");
  711. if (datateamrows.isNotEmpty()) {
  712. return getErrReturnObject().setErrMsg("该任务已由其他同事负责推进").toString();
  713. }
  714. }
  715. if (rows.get(0).getString("status").equals("提交")) {
  716. sqlList.add("update sa_workorder set status='进行中' where sa_workorderid ='"
  717. + sa_workorderid + "' and siteid='" + siteid + "'");
  718. } else {
  719. sqlList.add("update sa_workorder set status='待接单' where sa_workorderid ='"
  720. + sa_workorderid + "' and siteid='" + siteid + "'");
  721. }
  722. sqlList.add("delete from sys_datateam where ownertable='sa_workorder' and ownerid="
  723. + sa_workorderid + " and siteid='" + siteid + "'");
  724. if (projectlearders != null && !projectlearders.isEmpty()) {
  725. for (Object obj : projectlearders) {
  726. sqlList.addAll(DataTeam.createTeamSQL(this, "sa_workorder", sa_workorderid, (int) obj));
  727. }
  728. }
  729. dbConnect.runSqlUpdate(sqlList);
  730. return getSucReturnObject().toString();
  731. }
  732. @API(title = "删除", apiversion = R.ID20230206091803.v1.class)
  733. @CACHEING_CLEAN(apiversions = {R.ID20230206091603.v1.class, R.ID20230206091703.v1.class, R.ID20230206101303.v1.class, R.ID20230217100703.v1.class, R.ID20230217133003.v1.class})
  734. public String delete() throws YosException {
  735. JSONArray sa_serviceorderids = content.getJSONArray("sa_serviceorderids");
  736. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, sa_serviceorderids.size());
  737. for (Object o : sa_serviceorderids) {
  738. long sa_serviceorderid = Long.parseLong(o.toString());
  739. Rows RowsStatus = dbConnect
  740. .runSqlQuery("select t3.sa_warrantycardid from sa_serviceorder t1 left join sa_workorder t2 on t1.sa_serviceorderid=t2.sa_serviceorderid left join sa_warrantycard t3 on t3.sa_workorderid=t2.sa_workorderid where t1.siteid='" + siteid
  741. + "' and t1.sa_serviceorderid='" + sa_serviceorderid + "' and ifnull(t3.cardno,'')!=''");
  742. if (RowsStatus.isNotEmpty()) {
  743. if (RowsStatus.isNotEmpty()) {
  744. batchDeleteErr.addErr(sa_serviceorderid, "服务申请单已生成保修卡,不允许删除");
  745. continue;
  746. }
  747. }
  748. dbConnect.runSqlUpdate("delete from sa_serviceorder where siteid='" + siteid + "' and sa_serviceorderid="
  749. + sa_serviceorderid);
  750. dbConnect.runSqlUpdate("delete from sa_workorder where siteid='" + siteid + "' and sa_serviceorderid="
  751. + sa_serviceorderid);
  752. }
  753. return batchDeleteErr.getReturnObject().toString();
  754. }
  755. @API(title = "作废服务申请单", apiversion = R.ID2025121519311203.v1.class)
  756. @CACHEING_CLEAN(apiClass = {workorder.class, serviceorder.class, warrantycard.class})
  757. public String cancelServiceOrder() throws YosException {
  758. long sa_serviceorderid = content.getLong("sa_serviceorderid");
  759. String voidreason =content.getStringValue("voidreason");
  760. Rows userrows = dbConnect.runSqlQuery("select t2.usertype from sys_users t1 inner join sys_usersite t2 on t1.userid = t2.userid where t2.siteid = '" + siteid + "' and t1.userid=" + userid);
  761. long usertype = 0;
  762. if (userrows.isNotEmpty()) {
  763. usertype = userrows.get(0).getLong("usertype");
  764. }
  765. ArrayList<String> sqllist = new ArrayList<>();
  766. Rows workorderrows = dbConnect.runSqlQuery("select sa_workorderid from sa_workorder where sa_serviceorderid ='"
  767. + sa_serviceorderid + "' and siteid='" + siteid + "' and status!='作废'");
  768. sqllist.add("update sa_serviceorder set voidreason='"+voidreason+"',status='作废' where sa_serviceorderid="+sa_serviceorderid);
  769. sqllist.add(DataContrlLog.createLog(this, "sa_serviceorder", sa_serviceorderid, "作废", "服务申请单作废成功")
  770. .getSQL());
  771. if(workorderrows.isNotEmpty()){
  772. long sa_workorderid= workorderrows.get(0).getLong("sa_workorderid");
  773. voidreason="【服务申请单作废】"+voidreason;
  774. sqllist.add("update sa_workorder set voidreason='"+voidreason+"',status='作废' where sa_workorderid="+sa_workorderid);
  775. sqllist.add(DataContrlLog.createLog(this, "sa_workorder", sa_workorderid, "作废", "工单作废成功")
  776. .getSQL());
  777. Rows warrantycardrows = dbConnect.runSqlQuery("select sa_warrantycardid from sa_warrantycard where sa_workorderid ='"
  778. + sa_workorderid + "' and siteid='" + siteid + "' and isvoid=0");
  779. if(warrantycardrows.isNotEmpty()){
  780. if (usertype != 0 && usertype!=1) {
  781. return getErrReturnObject().setErrMsg("因存在生效中的保修卡,此操作暂时无法执行,请先联系总部完成保修卡作废流程。").toString();
  782. }
  783. sqllist.add("update sa_warrantycard set voiddate=CURRENT_TIME,voidreason='"+voidreason+"',isvoid=1 where sa_warrantycardid="+warrantycardrows.get(0).getLong("sa_warrantycardid"));
  784. sqllist.add(DataContrlLog.createLog(this, "sa_warrantycard", warrantycardrows.get(0).getLong("sa_warrantycardid"), "作废", "保修卡作废成功")
  785. .getSQL());
  786. }
  787. }
  788. dbConnect.runSqlUpdate(sqllist);
  789. return getSucReturnObject().toString();
  790. }
  791. @API(title = "撤回分配服务申请单", apiversion = R.ID2025121818251203.v1.class)
  792. @CACHEING_CLEAN(apiClass = {workorder.class, serviceorder.class, warrantycard.class})
  793. public String chehuiServiceOrder() throws YosException {
  794. long sa_serviceorderid = content.getLong("sa_serviceorderid");
  795. ArrayList<String> sqllist = new ArrayList<>();
  796. Rows serviceorderRows = dbConnect.runSqlQuery("select status,billno from sa_serviceorder where sa_serviceorderid ='"
  797. + sa_serviceorderid + "' and siteid='" + siteid + "'");
  798. if(serviceorderRows.isNotEmpty()){
  799. if(!(serviceorderRows.get(0).getString("status").equals("待受理") || serviceorderRows.get(0).getString("status").equals("待服务") || serviceorderRows.get(0).getString("status").equals("服务中"))){
  800. return getErrReturnObject().setErrMsg("非待受理/待服务/服务中状态的服务申请单无法撤回分配").toString();
  801. }
  802. sqllist.add("update sa_serviceorder set sys_enterpriseid_service=0,status='待分配',allocationdate=null,allocationby='' where sa_serviceorderid="+sa_serviceorderid);
  803. sqllist.add(DataContrlLog.createLog(this, "sa_serviceorder", sa_serviceorderid, "撤回分配", "服务申请单撤回分配成功")
  804. .getSQL());
  805. Rows workorderrows = dbConnect.runSqlQuery("select sa_workorderid from sa_workorder where sa_serviceorderid ='"
  806. + sa_serviceorderid + "' and siteid='" + siteid + "' and status!='作废'");
  807. if(workorderrows.isNotEmpty()){
  808. long sa_workorderid= workorderrows.get(0).getLong("sa_workorderid");
  809. sqllist.add("update sa_workorder set voidreason='服务申请单撤回分配',status='作废' where sa_workorderid="+sa_workorderid);
  810. sqllist.add(DataContrlLog.createLog(this, "sa_workorder", sa_workorderid, "作废", "工单作废成功")
  811. .getSQL());
  812. }
  813. }else{
  814. return getErrReturnObject().setErrMsg("服务申请单不存在").toString();
  815. }
  816. dbConnect.runSqlUpdate(sqllist);
  817. return getSucReturnObject().toString();
  818. }
  819. @API(title = "发送手机验证码", apiversion = R.ID20230215173103.v1.class, accesstoken = false)
  820. public String sendMessage() throws YosException {
  821. String customerphone = "";
  822. long sa_workorderid = content.getLong("sa_workorderid");
  823. Rows rows = dbConnect.runSqlQuery("select t1.type,t1.verificationcode,t1.verificationdate,t2.* from sa_workorder t1 inner join sa_serviceorder t2 on t1.sa_serviceorderid=t2.sa_serviceorderid and t1.siteid=t2.siteid where t1.sa_workorderid=" + sa_workorderid);
  824. if (rows.isEmpty()) {
  825. return getErrReturnObject().setErrMsg("该工单不存在").toString();
  826. }
  827. long createuserid = rows.get(0).getLong("createuserid");
  828. String type = rows.get(0).getString("type");
  829. Rows userrows = dbConnect.runSqlQuery("select t2.usertype,t1.phonenumber from sys_users t1 inner join sys_usersite t2 on t1.userid = t2.userid where t2.siteid = '" + siteid + "' and t1.userid=" + createuserid);
  830. long usertype = 0;
  831. if (userrows.isNotEmpty()) {
  832. usertype = userrows.get(0).getLong("usertype");
  833. } else {
  834. //return getErrReturnObject().setErrMsg("工单创建人信息有误").toString();
  835. }
  836. if (usertype == 99) {
  837. customerphone = userrows.get(0).getString("phonenumber");
  838. } else {
  839. if (type.equals("安装")) {
  840. customerphone = rows.get(0).getString("scenecontactphonenumber");
  841. }
  842. }
  843. String verificationCode = "";
  844. if (StringUtils.isBlank(rows.get(0).getString("verificationcode"))) {
  845. verificationCode = createVerificationCode();
  846. } else {
  847. verificationCode = rows.get(0).getString("verificationcode");
  848. }
  849. dbConnect.runSqlUpdate("update sa_workorder set verificationcode='" + verificationCode + "' where sa_workorderid=" + sa_workorderid);
  850. Rows wxserviceRows = dbConnect.runSqlQuery("select t2.userid from sys_wechatapp_openids t1 inner join sys_users t2 on t1.userid=t2.userid where t2.phonenumber='" + customerphone + "'");
  851. Row row = new Row();
  852. if (wxserviceRows.isEmpty()) {
  853. ArrayList<Long> userids = wxserviceRows.toArrayList("userid", new ArrayList<>());
  854. JSONObject extradata = new JSONObject();
  855. extradata.put("extraUserList", userids);
  856. Executor.sendEml(this, "verificationcode_push", sa_workorderid, siteid, extradata);
  857. if (!BaseClass.isdebug() && !Arrays.asList(Parameter.getString("system_invalidate_phonenumber").split(",")).contains(customerphone)) {
  858. row.put("code", 1);
  859. row.put("msg", "验证码已发送,请注意查收!");
  860. }
  861. } else {
  862. if (!BaseClass.isdebug() && !Arrays.asList(Parameter.getString("system_invalidate_phonenumber").split(",")).contains(customerphone)) {
  863. if (StringUtils.isNotBlank("customerphone")) {
  864. if (StringUtils.isNotBlank(rows.get(0).getString("verificationdate"))) {
  865. if (isMoreThanOneHourUsingCalendar(rows.get(0).getDate("verificationdate"), new Date())) {
  866. Sms sms = new Sms();
  867. sms.sendout(Sms.SmsType.Notice, customerphone, "尊敬的用户您好,您的工单服务已完成,完工验证码是" + verificationCode + "。");
  868. message_map.put(customerphone, new VerificationManage(verificationCode));
  869. dbConnect.runSqlUpdate("update sa_workorder set verificationdate=CURRENT_TIME where sa_workorderid=" + sa_workorderid);
  870. }
  871. } else {
  872. Sms sms = new Sms();
  873. sms.sendout(Sms.SmsType.Notice, customerphone, "尊敬的用户您好,您的工单服务已完成,完工验证码是" + verificationCode + "。");
  874. message_map.put(customerphone, new VerificationManage(verificationCode));
  875. dbConnect.runSqlUpdate("update sa_workorder set verificationdate=CURRENT_TIME where sa_workorderid=" + sa_workorderid);
  876. }
  877. }
  878. row.put("code", 1);
  879. row.put("msg", "手机验证码已发送,请注意查收!");
  880. } else {
  881. row.put("code", 1);
  882. row.put("msg", "手机验证码为:" + verificationCode);
  883. }
  884. }
  885. return getSucReturnObject().setData(row).toString();
  886. }
  887. /**
  888. * 验证码校验
  889. **/
  890. @API(title = "验证码校验", apiversion = R.ID20230215173203.v1.class, accesstoken = false)
  891. public String checkVerificationCode() throws YosException {
  892. String customerphone = "";
  893. long sa_workorderid = content.getLong("sa_workorderid");
  894. Rows rows = dbConnect.runSqlQuery("select t1.type,t2.* from sa_workorder t1 inner join sa_serviceorder t2 on t1.sa_serviceorderid=t2.sa_serviceorderid and t1.siteid=t2.siteid where t1.sa_workorderid=" + sa_workorderid);
  895. if (rows.isEmpty()) {
  896. return getErrReturnObject().setErrMsg("该工单不存在").toString();
  897. }
  898. long createuserid = rows.get(0).getLong("createuserid");
  899. String type = rows.get(0).getString("type");
  900. Rows userrows = dbConnect.runSqlQuery("select t2.usertype,t1.phonenumber from sys_users t1 inner join sys_usersite t2 on t1.userid = t2.userid where t2.siteid = '" + siteid + "' and t1.userid=" + createuserid);
  901. long usertype = 0;
  902. if (userrows.isNotEmpty()) {
  903. usertype = userrows.get(0).getLong("usertype");
  904. } else {
  905. //return getErrReturnObject().setErrMsg("工单创建人信息有误").toString();
  906. }
  907. if (usertype == 99) {
  908. customerphone = userrows.get(0).getString("phonenumber");
  909. } else {
  910. if (type.equals("安装")) {
  911. customerphone = rows.get(0).getString("scenecontactphonenumber");
  912. }
  913. }
  914. String code = content.getStringValue("code");
  915. boolean isgeneralcompletioncode = Parameter.getBoolean(siteid, "isgeneralcompletioncode");
  916. String generalcompletioncode = Parameter.getString(siteid, "generalcompletioncode");
  917. if (isgeneralcompletioncode) {
  918. if (!code.equals(generalcompletioncode)) {
  919. if (!message_map.containsKey(customerphone) || !message_map.get(customerphone).check(code)) {
  920. return getErrReturnObject().setErrMsg("验证码错误或者过期").toString();
  921. }
  922. }
  923. } else {
  924. if (!message_map.containsKey(customerphone) || !message_map.get(customerphone).check(code)) {
  925. return getErrReturnObject().setErrMsg("验证码错误或者过期").toString();
  926. }
  927. }
  928. return getSucReturnObject().toString();
  929. }
  930. private ArrayList<String> getAddWorkorderNodeSql(long sa_workorder_templateid, long sa_workorderid)
  931. throws YosException {
  932. ArrayList sqList = new ArrayList<String>();
  933. Rows rows = dbConnect.runSqlQuery(
  934. "select t1.sa_workorder_template_worksid,t1.sequence,t1.parentid,t2.* from sa_workorder_template_works t1 inner join sa_workpreset t2 on t1.siteid=t2.siteid and t1.sa_workpresetid=t2.sa_workpresetid where t1.siteid='"
  935. + siteid + "' and t1.sa_workorder_templateid =" + sa_workorder_templateid + " order by t1.sequence asc");
  936. RowsMap rowsMap = rows.toRowsMap("parentid");
  937. if (!rowsMap.get(0).isEmpty()) {
  938. for (Row row : rowsMap.get(0)) {
  939. workpresetInfo workpresetInfo = new workpresetInfo();
  940. workpresetInfo.setWorkname(row.getString("workname"));
  941. workpresetInfo.setRemarks(row.getString("remarks"));
  942. workpresetInfo.setAdditem(row.getLong("additem"));
  943. workpresetInfo.setAddperson(row.getLong("addperson"));
  944. workpresetInfo.setAmountpay(row.getLong("amountpay"));
  945. workpresetInfo.setConfirm(row.getLong("confirm"));
  946. workpresetInfo.setConfirm_options(JSONArray.parseArray(row.getString("confirm_options")));
  947. workpresetInfo.setContractupload(row.getLong("contractupload"));
  948. workpresetInfo.setFileupload(row.getLong("fileupload"));
  949. workpresetInfo.setItemtype(row.getString("itemtype"));
  950. workpresetInfo.setRequired(row.getLong("required"));
  951. workpresetInfo.setTextedit(row.getLong("textedit"));
  952. workpresetInfo.setSignature(row.getLong("signature"));
  953. workpresetInfo.setPasscheck(row.getLong("passcheck"));
  954. workpresetInfo.setQuestionedit(row.getLong("questionedit"));
  955. workpresetInfo.setQuestionoption(row.getString("questionoption"));
  956. String workpresetjson = JSONObject.toJSONString(workpresetInfo);
  957. SQLFactory sqlFactory = new SQLFactory(this, "服务工单流程节点新增");
  958. long sa_workorder_nodeid = createTableID("sa_workorder_node");
  959. sqlFactory.addParameter("sa_workorder_nodeid", sa_workorder_nodeid);
  960. sqlFactory.addParameter("sa_workorderid", sa_workorderid);
  961. sqlFactory.addParameter("siteid", siteid);
  962. sqlFactory.addParameter("parentid", 0);
  963. sqlFactory.addParameter("workpresetjson", workpresetjson);
  964. sqlFactory.addParameter("sequence", row.getLong("sequence"));
  965. sqlFactory.addParameter("userid", userid);
  966. sqlFactory.addParameter("username", username);
  967. sqList.add(sqlFactory.getSQL());
  968. if (!rowsMap.get(row.getLong("sa_workorder_template_worksid")).isEmpty()) {
  969. for (Row row2 : rowsMap.get(row.getLong("sa_workorder_template_worksid"))) {
  970. workpresetInfo workpresetInfo1 = new workpresetInfo();
  971. workpresetInfo1.setWorkname(row2.getString("workname"));
  972. workpresetInfo1.setRemarks(row2.getString("remarks"));
  973. workpresetInfo1.setAdditem(row2.getLong("additem"));
  974. workpresetInfo1.setAddperson(row2.getLong("addperson"));
  975. workpresetInfo1.setAmountpay(row2.getLong("amountpay"));
  976. workpresetInfo1.setConfirm(row2.getLong("confirm"));
  977. workpresetInfo1.setConfirm_options(JSONArray.parseArray(row2.getString("confirm_options")));
  978. workpresetInfo1.setContractupload(row2.getLong("contractupload"));
  979. workpresetInfo1.setFileupload(row2.getLong("fileupload"));
  980. workpresetInfo1.setItemtype(row2.getString("itemtype"));
  981. workpresetInfo1.setRequired(row2.getLong("required"));
  982. workpresetInfo1.setTextedit(row2.getLong("textedit"));
  983. workpresetInfo1.setSignature(row2.getLong("signature"));
  984. workpresetInfo1.setPasscheck(row2.getLong("passcheck"));
  985. workpresetInfo1.setQuestionedit(row2.getLong("questionedit"));
  986. workpresetInfo1.setQuestionoption(row2.getString("questionoption"));
  987. String workpresetjson1 = JSONObject.toJSONString(workpresetInfo1);
  988. SQLFactory sqlFactory1 = new SQLFactory(this, "服务工单流程节点新增");
  989. sqlFactory1.addParameter("sa_workorder_nodeid", createTableID("sa_workorder_node"));
  990. sqlFactory1.addParameter("sa_workorderid", sa_workorderid);
  991. sqlFactory1.addParameter("siteid", siteid);
  992. sqlFactory1.addParameter("parentid", sa_workorder_nodeid);
  993. sqlFactory1.addParameter("workpresetjson", workpresetjson1);
  994. sqlFactory1.addParameter("sequence", row2.getLong("sequence"));
  995. sqlFactory1.addParameter("userid", userid);
  996. sqlFactory1.addParameter("username", username);
  997. sqList.add(sqlFactory1.getSQL());
  998. }
  999. }
  1000. }
  1001. }
  1002. return sqList;
  1003. }
  1004. // private String sendMessage_0(String phone, String verificationCode) throws Exception {
  1005. // HttpURLRest rest = new HttpURLRest("http://smssh1.253.com/msg/v1/send/json");
  1006. // rest.addHeader("Content-type", "applica分配tion/json");
  1007. // JSONObject jsonObject = new JSONObject();
  1008. // jsonObject.put("account", "N3147701");
  1009. // jsonObject.put("password", "4ClGyab6fv6a87");
  1010. // jsonObject.put("msg", "【浙江美大】您好,您的验证码是" + verificationCode);
  1011. // jsonObject.put("phone", phone);
  1012. // rest.addRawBody(jsonObject.toString());
  1013. // String s = rest.post();
  1014. /// / PaoSetRemote verCodehistory = getpaoset("VerCodehistory");
  1015. /// / PaoRemote remote = verCodehistory.addAtEnd();
  1016. /// / remote.setValue("phone",phone);
  1017. /// / remote.setValue("msg","【Banninger】您好,您的验证码是"+verificationCode);
  1018. /// / remote.setValue("content",s);
  1019. /// / verCodehistory.save();
  1020. // return s;
  1021. // }
  1022. public static String createVerificationCode() {
  1023. String s = "";
  1024. while (s.length() < 6)
  1025. s += (int) (Math.random() * 10);
  1026. return s;
  1027. }
  1028. /**
  1029. * 方法2:使用 Calendar 计算是否超过一小时
  1030. */
  1031. public boolean isMoreThanOneHourUsingCalendar(Date date1, Date date2) {
  1032. Calendar cal1 = Calendar.getInstance();
  1033. Calendar cal2 = Calendar.getInstance();
  1034. cal1.setTime(date1);
  1035. cal2.setTime(date2);
  1036. // 计算相差的毫秒数
  1037. long diffInMillis = Math.abs(cal2.getTimeInMillis() - cal1.getTimeInMillis());
  1038. return diffInMillis >= 3600000L;
  1039. }
  1040. }