orderclue.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. package restcontroller.saletool.orderclue.web;
  2. import beans.remind.Remind;
  3. import beans.user.User;
  4. import com.alibaba.fastjson2.JSONArray;
  5. import com.alibaba.fastjson2.JSONObject;
  6. import common.Controller;
  7. import common.YosException;
  8. import common.annotation.API;
  9. import common.data.*;
  10. import restcontroller.R;
  11. import java.io.IOException;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. @API(title = "线索池-web")
  15. public class orderclue extends Controller {
  16. public orderclue(JSONObject content) throws YosException {
  17. super(content);
  18. }
  19. /**
  20. * 获取老板的线索id
  21. *
  22. * @return
  23. * @throws YosException
  24. */
  25. public ArrayList<Long> getLeaderIds() throws YosException {
  26. return dbConnect.runSqlQuery("SELECT sat_orderclueid FROM sat_orderclue_auth WHERE sys_enterpriseid = " + sys_enterpriseid).toArrayList("sat_orderclueid", new ArrayList<>());
  27. }
  28. /**
  29. * 获取业务员的线索id
  30. *
  31. * @return
  32. * @throws YosException
  33. */
  34. public ArrayList<Long> getSalesIds(Long sys_enterprise_hrid) throws YosException {
  35. return dbConnect.runSqlQuery("SELECT sat_orderclueid FROM sat_orderclue_auth WHERE sys_enterpriseid = " + sys_enterpriseid + " and hrid = " + sys_enterprise_hrid).toArrayList("sat_orderclueid", new ArrayList<>());
  36. }
  37. /**
  38. * 查询出当前经销商下线索状态是待跟进的数据
  39. *
  40. * @return
  41. * @throws YosException
  42. */
  43. public ArrayList<Long> getFollowIds() throws YosException {
  44. return dbConnect.runSqlQuery("SELECT sat_orderclueid FROM sat_orderclue WHERE sat_orderclueid in (SELECT sat_orderclueid FROM sat_orderclue_auth WHERE sys_enterpriseid = " + sys_enterpriseid + ") AND `status` = '待跟进'").toArrayList("sat_orderclueid", new ArrayList<>());
  45. }
  46. @API(title = "线索池-web-列表", apiversion = R.ID20221101094502.v1.class)
  47. public String selectList() throws YosException, IOException {
  48. boolean isAll = content.getBoolean("isAll");
  49. ArrayList<Long> sat_orderclueids = new ArrayList<>();
  50. if (usertype == 1) {
  51. sat_orderclueids = SQLFactory.createQuerySQL(this, "sat_orderclue_auth", "sat_orderclueid").setWhere("sys_enterpriseid", sys_enterpriseid).query().toArrayList("sat_orderclueid", new ArrayList<>());
  52. } else {
  53. if (isleader) {
  54. sat_orderclueids.addAll(getLeaderIds());
  55. } else {
  56. sat_orderclueids.addAll(getSalesIds(getEnterpriseHr(userid).getLong("sys_enterprise_hrid")));
  57. }
  58. sat_orderclueids.addAll(getFollowIds());
  59. }
  60. //用来判断是否是成员跟进
  61. Long memberHrid = 0L;
  62. if (usertype != 1) {
  63. if (isleader) {
  64. //经销商老板
  65. Rows leaderRows = dbConnect.runSqlQuery("SELECT sys_enterprise_hrid FROM sys_enterprise_hr WHERE isleader=1 AND sys_enterpriseid = " + sys_enterpriseid);
  66. if (leaderRows.isNotEmpty()) {
  67. memberHrid = leaderRows.get(0).getLong("sys_enterprise_hrid");
  68. }
  69. } else {
  70. //经销商个人
  71. Rows leaderRows = dbConnect.runSqlQuery("SELECT sys_enterprise_hrid FROM sys_enterprise_hr WHERE userid = " + userid);
  72. if (leaderRows.isNotEmpty()) {
  73. memberHrid = leaderRows.get(0).getLong("sys_enterprise_hrid");
  74. }
  75. }
  76. }
  77. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sat_orderclue", "sat_orderclueid", "name", "phonenumber", "province", "city", "county", "address", "notes", "cluesource", "status").setTableAlias("t1");
  78. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sat_orderclue_auth", "t2", "sat_orderclueid=:sat_orderclueid ");
  79. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sys_enterprise", "t3", "t2.sys_enterpriseid=t3.sys_enterpriseid", "enterprisename");
  80. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sys_enterprise_hr", "t4", "t2.hrid=t4.sys_enterprise_hrid", "sys_enterprise_hrid");
  81. querySQL.addQueryFields("leadername", "t4.name");
  82. querySQL.addQueryFields("isTeam", "if(t1.isprivate = 0,'总部','团队')");
  83. querySQL.addQueryFields("isMemberFollow", "if(t2.hrid != " + memberHrid + ",1,0)");
  84. querySQL.setWhere("t1.sat_orderclueid", sat_orderclueids);
  85. if (!isAll) {
  86. querySQL.setPage(pageSize, pageNumber);
  87. }
  88. Rows rows = querySQL.query();
  89. QuerySQL ordercluefollowuplogQuery = SQLFactory.createQuerySQL(this, "sat_ordercluefollowuplog", "sat_orderclue_authid");
  90. ordercluefollowuplogQuery.addQueryFields("followtime", "MAX(createdate)");
  91. ordercluefollowuplogQuery.setWhere("sat_orderclue_authid", rows.toArrayList("sat_orderclue_authid"));
  92. RowsMap ordercluefollowuplogRowsMap = ordercluefollowuplogQuery.query().toRowsMap("sat_orderclue_authid");
  93. SQLFactory sqlFactory = new SQLFactory(this, "查询最新的跟进方式");
  94. sqlFactory.addParameter("siteid", siteid);
  95. sqlFactory.addParameter_in("sat_orderclueid", sat_orderclueids);
  96. RowsMap logtypeRowsMap = dbConnect.runSqlQuery(sqlFactory.getSQL()).toRowsMap("sat_orderclueid");
  97. RowsMap lognumRowsMap = dbConnect.runSqlQuery("SELECT COUNT(0) count, sat_orderclueid from sat_ordercluefollowuplog WHERE siteid='" + siteid + "' GROUP BY sat_orderclueid").toRowsMap("sat_orderclueid");
  98. for (Row row : rows) {
  99. if (ordercluefollowuplogRowsMap.containsKey(row.getString("sat_orderclue_authid"))) {
  100. row.put("followtime", ordercluefollowuplogRowsMap.get(row.getString("sat_orderclue_authid")).get(0).getString("followtime"));
  101. } else {
  102. row.put("followtime", "");
  103. }
  104. if (lognumRowsMap.containsKey(row.getString("sat_orderclueid"))) {
  105. row.put("lognum", lognumRowsMap.get(row.getString("sat_orderclueid")).get(0).getLong("count"));
  106. } else {
  107. row.put("lognum", 0);
  108. }
  109. if (logtypeRowsMap.containsKey(row.getString("sat_orderclueid"))) {
  110. Rows logtypeRows = logtypeRowsMap.get(row.getString("sat_orderclueid"));
  111. row.put("logtype", logtypeRows.get(0).getString("logtype"));
  112. row.put("followcontent", logtypeRows.get(0).getString("content"));
  113. row.put("followBy", logtypeRows.get(0).getString("createby"));
  114. row.put("followDate", logtypeRows.get(0).getString("createdate"));
  115. } else {
  116. row.put("logtype", "");
  117. row.put("followcontent", "");
  118. row.put("followBy", "");
  119. row.put("followDate", "");
  120. }
  121. }
  122. if (isAll) {
  123. String[] columns = {"sat_orderclueid", "sys_enterprise_hrid", "isMemberFollow", "logtype", "lognum", "logtype", "followBy", "followDate", "isTeam"};
  124. for (String column : columns) {
  125. rows.getFieldList().remove(column);
  126. }
  127. Rows uploadRows = saveToExcelAttachment("1111", "线索池", rows, getTitleMap());
  128. return getSucReturnObject().setData(uploadRows).toString();
  129. }
  130. return getSucReturnObject().setData(rows).toString();
  131. }
  132. @API(title = "线索池-web-根据状态查询线索数量", apiversion = R.ID2026020914460801.v1.class)
  133. public String getCount() throws YosException {
  134. ArrayList<Long> ids = new ArrayList<>();
  135. //查询经销商老板还是经销商团队成员
  136. if (isleader) {
  137. ids.addAll(getLeaderIds());
  138. } else {
  139. ids.addAll(getSalesIds(getEnterpriseHr(userid).getLong("sys_enterprise_hrid")));
  140. }
  141. ids.addAll(getFollowIds());
  142. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sat_orderclue");
  143. querySQL.addQueryFields("num", "count(0)");
  144. querySQL.setWhere("status", new String[]{"待跟进", "跟进中"});
  145. querySQL.setWhere("sat_orderclueid", ids);
  146. Rows rows = querySQL.query();
  147. JSONObject resObj = new JSONObject();
  148. resObj.put("count", rows.get(0).getString("num"));
  149. return getSucReturnObject().setData(resObj).toString();
  150. }
  151. @API(title = "线索池-编辑", apiversion = R.ID20221205162402.v1.class)
  152. public String edit() throws YosException {
  153. Long sat_orderclueid = content.getLong("sat_orderclueid");
  154. String name = content.getString("name");
  155. String phonenumber = content.getString("phonenumber");
  156. String province = content.getString("province");
  157. String city = content.getString("city");
  158. String county = content.getString("county");
  159. String address = content.getString("address");
  160. String cluesource = content.getString("cluesource");
  161. String notes = content.getString("notes");
  162. SQLDump sqlDump = new SQLDump();
  163. if (sat_orderclueid <= 0) {
  164. sat_orderclueid = createTableID("sat_orderclue");
  165. InsertSQL orderclueInsert = SQLFactory.createInsertSQL(this, "sat_orderclue");
  166. orderclueInsert.setValue("sat_orderclueid", sat_orderclueid);
  167. orderclueInsert.setValue("name", name);
  168. orderclueInsert.setValue("phonenumber", phonenumber);
  169. orderclueInsert.setValue("province", province);
  170. orderclueInsert.setValue("city", city);
  171. orderclueInsert.setValue("county", county);
  172. orderclueInsert.setValue("address", address);
  173. orderclueInsert.setValue("notes", notes);
  174. orderclueInsert.setValue("cluesource", cluesource);
  175. orderclueInsert.setValue("isprivate", 1);
  176. orderclueInsert.setValue("status", "待跟进");
  177. sqlDump.add(orderclueInsert);
  178. sqlDump.add(getAddAuthSql(sat_orderclueid, getEnterpriseHr(userid).getLong("sys_enterprise_hrid")));
  179. } else {
  180. UpdateSQL orderclueUpdate = SQLFactory.createUpdateSQL(this, "sat_orderclue");
  181. orderclueUpdate.setValue("name", name);
  182. orderclueUpdate.setValue("phonenumber", phonenumber);
  183. orderclueUpdate.setValue("province", province);
  184. orderclueUpdate.setValue("city", city);
  185. orderclueUpdate.setValue("county", county);
  186. orderclueUpdate.setValue("address", address);
  187. orderclueUpdate.setValue("notes", notes);
  188. orderclueUpdate.setValue("cluesource", cluesource);
  189. orderclueUpdate.setUniqueid(sat_orderclueid);
  190. sqlDump.add(orderclueUpdate);
  191. }
  192. sqlDump.commit(this);
  193. return getSucReturnObject().toString();
  194. }
  195. @API(title = "线索池-web-详情", apiversion = R.ID2026020914464101.v1.class)
  196. public String selectDetail() throws YosException {
  197. Long sat_orderclueid = content.getLong("sat_orderclueid");
  198. Long memberHrid = 0L;
  199. QuerySQL hrQuery = SQLFactory.createQuerySQL(this, "sys_enterprise_hr", "sys_enterprise_hrid");
  200. if (isleader) {
  201. hrQuery.setWhere("isleader", 1).setWhere("sys_enterpriseid", sys_enterpriseid);
  202. } else {
  203. hrQuery.setWhere("userid", userid);
  204. }
  205. Rows query = hrQuery.query();
  206. if (query.isNotEmpty()) {
  207. memberHrid = query.get(0).getLong("sys_enterprise_hrid");
  208. }
  209. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sat_orderclue", "sat_orderclueid", "name", "phonenumber", "province", "city", "county", "address", "notes", "cluesource", "status").setTableAlias("t1");
  210. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sat_orderclue_auth", "t2", "sat_orderclueid=:sat_orderclueid ");
  211. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sys_enterprise", "t3", "t3.sys_enterpriseid=t2.sys_enterpriseid", "enterprisename");
  212. querySQL.addJoinTable(QuerySQL.JOINTYPE.left, "sys_enterprise_hr", "t4", "t4.sys_enterprise_hrid=t2.hrid");
  213. querySQL.addQueryFields("createBy", "t1.createby");
  214. querySQL.addQueryFields("createDate", "t1.createdate");
  215. querySQL.addQueryFields("editBy", "t1.changeby");
  216. querySQL.addQueryFields("editDate", "t1.changedate");
  217. querySQL.addQueryFields("leadername", "t4.name");
  218. querySQL.addQueryFields("leaderuserid", "t4.userid");
  219. querySQL.addQueryFields("isMemberFollow", "if(t2.hrid != " + memberHrid + ",1,0)");
  220. querySQL.setWhere("t1.sat_orderclueid", sat_orderclueid);
  221. Rows detailRows = querySQL.query();
  222. Row detailRow = detailRows.isNotEmpty() ? detailRows.get(0) : new Row();
  223. //分配人,分配时间
  224. String assignedBy = "";
  225. String assignedDate = "";
  226. Rows assignedRows = dbConnect.runSqlQuery("SELECT sat_orderclue_authid,createby,createdate FROM sat_orderclue_auth WHERE sat_orderclueid = " + sat_orderclueid + " ORDER BY sat_orderclue_authid LIMIT 1");
  227. if (assignedRows.isNotEmpty()) {
  228. assignedBy = assignedRows.get(0).getString("createby");
  229. assignedDate = assignedRows.get(0).getString("createdate");
  230. }
  231. //转移人,转移时间
  232. String changeBy = "";
  233. String changeDate = "";
  234. Row countRow = dbConnect.runSqlQuery(0, " SELECT COUNT(0) count FROM sat_orderclue_auth WHERE sat_orderclueid = " + sat_orderclueid);
  235. if (countRow.getLong("count") > 1) {
  236. Row changeRow = dbConnect.runSqlQuery(0, " SELECT changeby,changedate FROM sat_orderclue_auth WHERE sat_orderclueid = " + sat_orderclueid);
  237. changeBy = changeRow.getString("changeby");
  238. changeDate = changeRow.getString("changedate");
  239. }
  240. //最近跟进人,最近跟进时间
  241. String followBy = "";
  242. String followDate = "";
  243. //获取跟进id
  244. Long sat_orderclue_authid = 0L;
  245. Rows authRows = dbConnect.runSqlQuery(" SELECT sat_orderclue_authid FROM sat_orderclue_auth WHERE sat_orderclueid = " + sat_orderclueid);
  246. if (authRows.isNotEmpty()) {
  247. sat_orderclue_authid = authRows.get(0).getLong("sat_orderclue_authid");
  248. }
  249. Rows followRows = dbConnect.runSqlQuery(" SELECT createby,createdate FROM sat_ordercluefollowuplog WHERE sat_orderclue_authid = " + sat_orderclue_authid + " ORDER BY createdate DESC LIMIT 1");
  250. if (followRows.isNotEmpty()) {
  251. followBy = followRows.get(0).getString("createby");
  252. followDate = followRows.get(0).getString("createdate");
  253. }
  254. detailRow.put("assignedBy", assignedBy);
  255. detailRow.put("assignedDate", assignedDate);
  256. detailRow.put("changeBy", changeBy);
  257. detailRow.put("changeDate", changeDate);
  258. detailRow.put("followBy", followBy);
  259. detailRow.put("followDate", followDate);
  260. return getSucReturnObject().setData(detailRow).toString();
  261. }
  262. @API(title = "线索池-web-跟进列表", apiversion = R.ID20221101094602.v1.class)
  263. public String getFollowList() throws YosException {
  264. Long sat_orderclueid = content.getLong("sat_orderclueid");
  265. QuerySQL ordercluefollowuplogQuery = SQLFactory.createQuerySQL(this, "sat_ordercluefollowuplog", "createby", "createdate", "content", "followupmode", "logtype", "competitor").setTableAlias("t1");
  266. ordercluefollowuplogQuery.addJoinTable(JOINTYPE.inner, "sat_orderclue_auth", "t2", "sat_orderclue_authid=:sat_orderclue_authid");
  267. ordercluefollowuplogQuery.setWhere("t1.sat_orderclueid", sat_orderclueid);
  268. ordercluefollowuplogQuery.setOrderBy("t1.createdate");
  269. Rows rows = ordercluefollowuplogQuery.query();
  270. return getSucReturnObject().setData(rows).toString();
  271. }
  272. @API(title = "线索池-web-线索跟进新增", apiversion = R.ID20221208100602.v1.class)
  273. public String addFollowUpLog() throws YosException {
  274. Long sat_orderclueid = content.getLong("sat_orderclueid");
  275. //先转移操作
  276. content.put("sys_enterprise_hrid", getEnterpriseHr(userid).getLong("sys_enterprise_hrid"));
  277. content.put("sat_orderclueid", new Long[]{sat_orderclueid});
  278. String followupmode = content.getStringValue("followupmode");//跟进方式
  279. String competitor = content.getStringValue("competitor");//竟品
  280. String contentTxt = content.getStringValue("content");//跟进内容
  281. String logtype = content.getString("logtype");//记录类型
  282. long sat_orderclue_authid = 0L;
  283. Rows authRows = dbConnect.runSqlQuery(" SELECT sat_orderclue_authid FROM sat_orderclue_auth WHERE sat_orderclueid = " + sat_orderclueid);
  284. if (authRows.isNotEmpty()) {
  285. sat_orderclue_authid = authRows.get(0).getLong("sat_orderclue_authid");
  286. }
  287. InsertSQL ordercluefollowuplogInsert = SQLFactory.createInsertSQL(this, "sat_ordercluefollowuplog");
  288. ordercluefollowuplogInsert.setValue("sat_orderclueid", sat_orderclueid);
  289. ordercluefollowuplogInsert.setValue("content", contentTxt);
  290. ordercluefollowuplogInsert.setValue("followupmode", followupmode);
  291. ordercluefollowuplogInsert.setValue("logtype", logtype);
  292. ordercluefollowuplogInsert.setValue("competitor", competitor);
  293. ordercluefollowuplogInsert.setValue("sat_orderclue_authid", sat_orderclue_authid);
  294. ordercluefollowuplogInsert.insert();
  295. if (logtype.contains("跟进") || logtype.contains("预约到店") || logtype.contains("互加微信")) {
  296. updateStatus(sat_orderclueid, "跟进中");
  297. } else if (logtype.contains("成交")) {
  298. updateStatus(sat_orderclueid, "已成交");
  299. } else if (logtype.contains("无效")) {
  300. updateStatus(sat_orderclueid, "已无效");
  301. }
  302. return getSucReturnObject().toString();
  303. }
  304. /**
  305. * 发送消息:经销商团队人员
  306. *
  307. * @param sat_orderclueid_array
  308. * @param sys_enterprise_hrid
  309. * @throws YosException
  310. */
  311. public void sendMsg(JSONArray sat_orderclueid_array, Long sys_enterprise_hrid) throws YosException {
  312. Rows rows = dbConnect.runSqlQuery("SELECT userid FROM sys_enterprise_hr WHERE sys_enterprise_hrid = " + sys_enterprise_hrid);
  313. for (Row row : rows) {
  314. for (Object id : sat_orderclueid_array) {
  315. Remind remind = new Remind(this);
  316. remind.setType("应用");
  317. remind.setTitle("线索通知");
  318. remind.setContent("您有管理员转移的线索,请继续跟进!");
  319. remind.setTouserid(row.getLong("userid"));
  320. remind.setObjectname("sat_orderclue");
  321. remind.setObjectid(Long.parseLong(id.toString()));
  322. remind.sendByDialogMsg().createSys_message();
  323. remind.setToemail(User.getUserMailAddress(this, row.getLong("userid")));
  324. remind.sendByMail();
  325. }
  326. }
  327. }
  328. //给新建的线索添加一条授权记录,默认授权给到经销商老板
  329. public InsertSQL getAddAuthSql(long sat_orderclueid, Long sys_enterprise_hrid) throws YosException {
  330. InsertSQL orderclue_authInsert = SQLFactory.createInsertSQL(this, "sat_orderclue_auth");
  331. orderclue_authInsert.setValue("sys_enterpriseid", sys_enterpriseid);
  332. orderclue_authInsert.setValue("sat_orderclueid", sat_orderclueid);
  333. orderclue_authInsert.setValue("isused", 1);
  334. orderclue_authInsert.setValue("hrid", sys_enterprise_hrid);
  335. return orderclue_authInsert;
  336. }
  337. //更新线索状态
  338. public void updateStatus(Long sat_orderclueid, String status) throws YosException {
  339. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sat_orderclue");
  340. updateSQL.setValue("status", status);
  341. updateSQL.setValue("sat_orderclueid", sat_orderclueid);
  342. updateSQL.update();
  343. }
  344. //返回导出的标题
  345. public HashMap<String, String> getTitleMap() {
  346. HashMap<String, String> titleMap = new HashMap<>();
  347. titleMap.put("sat_orderclueid", "id");
  348. titleMap.put("name", "客户名称");
  349. titleMap.put("phonenumber", "手机号");
  350. titleMap.put("province", "省");
  351. titleMap.put("city", "市");
  352. titleMap.put("county", "县");
  353. titleMap.put("address", "地址");
  354. titleMap.put("notes", "备注");
  355. titleMap.put("cluesource", "来源");
  356. titleMap.put("status", "状态");
  357. titleMap.put("enterprisename", "经销商名称");
  358. titleMap.put("leadername", "负责人");
  359. titleMap.put("isTeam", "是否总部");
  360. titleMap.put("followtime", "最近跟进时间");
  361. titleMap.put("followcontent", "最近跟进内容");
  362. return titleMap;
  363. }
  364. }