AfterSaleGather.aspx 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage/ErpView.master" AutoEventWireup="true" CodeFile="AfterSaleGather.aspx.cs" Inherits="ECharts_AfterSaleGather" %>
  2. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
  3. <style>
  4. .mini-panel-header {
  5. height: 45px
  6. }
  7. </style>
  8. <script src="../js/miniui/HeaderFilter.js" type="text/javascript"></script>
  9. <link href="../js/miniui/HeaderFilter.css" rel="stylesheet" type="text/css" />
  10. <script type="text/javascript">
  11. let current_index = 0;
  12. $(() => {
  13. let miniTabs = mini.get("miniTabs");
  14. miniTabs.on("activechanged", function (e) {
  15. current_index = e.index;
  16. })
  17. let html = `<a class="mini-button mini-button-success" iconcls="icon-folder" onclick="exportAfterFn(this)">导出</a>`;
  18. $.each($(".mini-panel"), function (index, value) {
  19. mini.get($(this).attr("id")).setButtons([{ html }]);
  20. });
  21. })
  22. function exportAfterFn(that) {
  23. let grid = mini.get($(that).parents(".mini-panel").find(".panel").attr("id"));
  24. let extname = $("#hRepTitle").val();
  25. extname = extname == "" ? "导出报表" : extname
  26. if (grid == null) {
  27. alert("无法导出");
  28. return;
  29. }
  30. let columns = grid.columns;
  31. function getColumns(columns) {
  32. let cols = [];
  33. let h = "";
  34. for (let i = 0; i < columns.length; i++) {
  35. let column = columns[i];
  36. //if (!column.visible || column.header == undefined) {
  37. // continue;
  38. //}
  39. if (column.header == undefined || column.header == "#") {
  40. continue;
  41. }
  42. if (typeof column.header == "function") continue;
  43. if (column.header.indexOf("<") != -1) h = column.header.toString().substring(0, column.header.indexOf("<"));
  44. else h = column.header.toString();
  45. h = h.replace(/ /g, "");
  46. //if (i == 1) alert(h);
  47. //alert(column.header);
  48. //var col = { header: h, field: column.field, type: column.type, visible: column.visible };
  49. let col = { header: h, field: column.field, type: column.type, width: column.width, visible: true };
  50. if (column.columns) {
  51. col.columns = getColumns(column.columns);
  52. }
  53. cols.push(col);
  54. }
  55. return cols;
  56. }
  57. columns = getColumns(columns);
  58. let type = "";
  59. let sel_row = grid.getSelecteds();
  60. if (grid.multiSelect && sel_row.length > 0 || grid.url == "" || grid.showPager == false) {
  61. type = "bexcel";
  62. }
  63. else type = grid.url == "" ? "bexcel" : "excel";
  64. downLoad(grid, GetPrePath() + "/Reports/comExports.aspx", { extname: extname, url: encodeURIComponent(grid.url), type: type, columns: columns }, function () {
  65. //alert("导出成功");
  66. });
  67. }
  68. function downLoad(grid, url, fields, callback) {
  69. //创建Form
  70. var submitfrm = document.createElement("form");
  71. submitfrm.action = url;
  72. submitfrm.method = "post";
  73. submitfrm.target = "_blank";
  74. document.body.appendChild(submitfrm);
  75. if (fields) {
  76. for (var p in fields) {
  77. var input = mini.append(submitfrm, "<input type='hidden' name='" + p + "'>");
  78. var v = fields[p];
  79. if (typeof v != "string") v = mini.encode(v);
  80. input.value = v;
  81. }
  82. }
  83. if (grid == null) {
  84. alert("无法导出");
  85. return;
  86. }
  87. var parms = grid._dataSource.loadParams;
  88. for (var item in parms) {
  89. if (parms[item] == undefined || parms[item] == null) continue;
  90. mini.append(submitfrm, "<input type='hidden' name='" + item + "' value=\"" + parms[item] + "\">");
  91. }
  92. var sel_row = grid.getSelecteds();
  93. if (grid.multiSelect && sel_row.length > 0) {
  94. mini.append(submitfrm, "<input type='hidden' name='hExData' value='" + mini.encode(sel_row) + "'>");
  95. } else {
  96. if (grid.url == undefined || grid.url == "" || grid.showPager == false) {
  97. //ame = 'hExData' value = '" + mini.encode(grid.data)
  98. mini.append(submitfrm, "<input type='hidden' name='hExData' value='" + mini.encode(grid.data) + "'>");
  99. }
  100. }
  101. if (mini.get("txtSdate") != null && mini.get("txtSdate").getText() != "") {
  102. mini.append(submitfrm, "<input type='hidden' name='hExSdate' value=\"" + mini.get("txtSdate").getText() + "\">");
  103. }
  104. if (mini.get("txtEdate") != null && mini.get("txtEdate").getText() != "") {
  105. mini.append(submitfrm, "<input type='hidden' name='hExEdate' value=\"" + mini.get("txtEdate").getText() + "\">");
  106. }
  107. //mini.append()
  108. submitfrm.submit();
  109. setTimeout(function () {
  110. submitfrm.parentNode.removeChild(submitfrm);
  111. if (callback) callback();
  112. }, 1000);
  113. }
  114. //查询按钮
  115. function searchFn() {
  116. let miniTabs = mini.get("miniTabs");
  117. var form = new mini.Form("#ctl00_f_all");
  118. var data = form.getData(true, false);
  119. var s = data;
  120. let current_ele = miniTabs.getTabBodyEl(current_index);
  121. $.each($(current_ele).find(".panel"), function (index, value) {
  122. mini.get($(this).attr("id")).load({
  123. date1: s.afterdate1, date2: s.afterdate2, pay_date1: s.date1, pay_date2: s.date2
  124. })
  125. });
  126. let sup_goods_grid = mini.get("sup_goods_grid");
  127. let sup_after_grid = mini.get("sup_after_grid");
  128. let total_reason_grid = mini.get("total_reason_grid");
  129. new HeaderFilter(sup_goods_grid, {
  130. columns: [
  131. { name: 'goodsName' },
  132. { name: "ComName" }
  133. ],
  134. callback: function (column, filtered) {
  135. console.log(column, filtered)
  136. }
  137. });
  138. new HeaderFilter(sup_after_grid, {
  139. columns: [
  140. { name: 'AfterSaleReason1' },
  141. { name: 'AfterSaleReason2' },
  142. { name: 'AfterSaleReason3' },
  143. { name: "ComName" }
  144. ],
  145. callback: function (column, filtered) {
  146. console.log(column, filtered)
  147. }
  148. });
  149. new HeaderFilter(total_reason_grid, {
  150. columns: [
  151. { name: 'AfterSaleReason1' },
  152. { name: 'AfterSaleReason2' },
  153. { name: 'AfterSaleReason3' }
  154. ],
  155. callback: function (column, filtered) {
  156. console.log(column, filtered)
  157. }
  158. });
  159. }
  160. function onSearchCheckedChanged(e) {
  161. var btn = e.sender;
  162. var checked = btn.getChecked();
  163. var text = btn.getText();
  164. var form = new mini.Form("#ctl00_f_all");
  165. var data = form.getData(true, false);
  166. var s = data;
  167. if (checked) {
  168. var stime = "";
  169. var etime = "";
  170. var timearr = [];
  171. if (text == "本日") {
  172. var day = getCurDate();
  173. timearr.push(day);
  174. timearr.push(day);
  175. }
  176. else if (text == "本周") {
  177. timearr = getWeekStartAndEnd();
  178. }
  179. else if (text == "本月") {
  180. timearr = getMonthStartAndEnd();
  181. }
  182. stime = timearr[0];
  183. etime = timearr[1];
  184. grid.load({
  185. shopname: s.shop, designer: s.design, order_area: s.order_area, org: s.designerorg, date1: stime, date2: etime, UpDate1: s.UpDate1, UpDate2: s.UpDate2
  186. });
  187. }
  188. mini.get("aSearchMonth").setChecked(false);
  189. mini.get("aSearchDay").setChecked(false);
  190. mini.get("aSearchWeek").setChecked(false);
  191. }
  192. //查询本日
  193. function onSearchToday() {
  194. var form = new mini.Form("#ctl00_f_all");
  195. var data = form.getData(true, false);
  196. var s = data;
  197. var DateType = "Today";
  198. grid.load({
  199. shopname: s.shop, designer: s.designer, order_area: s.order_area, org: s.designerorg, dateType: DateType
  200. });
  201. }
  202. //查询本周
  203. function onSearchThisWeek() {
  204. var form = new mini.Form("#ctl00_f_all");
  205. var data = form.getData(true, false);
  206. var s = data;
  207. var DateType = "Week";
  208. grid.load({
  209. shopname: s.shop, designer: s.designer, order_area: s.order_area, org: s.designerorg, dateType: DateType
  210. });
  211. }
  212. //查询本月
  213. function onSearchThisMonth() {
  214. var form = new mini.Form("#ctl00_f_all");
  215. var data = form.getData(true, false);
  216. var s = data;
  217. var DateType = "Month";
  218. grid.load({
  219. shopname: s.shop, designer: s.designer, order_area: s.order_area, org: s.designerorg, dateType: DateType
  220. });
  221. }
  222. //清除查询内容
  223. function clearFn() {
  224. //$("#ctl00_f_all").find("input").val("");
  225. var form = new mini.Form("#ctl00_f_all");
  226. form.clear();
  227. mini.get("aSearchMonth").setChecked(false);
  228. mini.get("aSearchDay").setChecked(false);
  229. mini.get("aSearchWeek").setChecked(false);
  230. }
  231. function onDrawSummaryCell(e) {
  232. var result = e.result;
  233. var rdata = result.data;
  234. //console.log("result:", result);
  235. var totalPayment = 0;
  236. var allOrder = 0;
  237. var wait = 0;
  238. var designing = 0;
  239. var finish = 0;
  240. var rateAp = 0;
  241. var payPrice = 0;
  242. for (var item of rdata) {
  243. totalPayment += parseFloat(item.Amount);
  244. allOrder += parseInt(item.AllOrder);
  245. wait += parseInt(item.WaitDesign);
  246. designing += parseInt(item.Designing);
  247. finish += parseInt(item.DesignFinish);
  248. rateAp += parseFloat(item.FinalizationRate);
  249. payPrice += parseFloat(item.PayPrice);
  250. }
  251. var grid = e.sender;
  252. totalPayment = Math.floor(totalPayment * 100) / 100;
  253. rateAp = Math.floor(rateAp / rdata.length * 100) / 100;
  254. //客户端汇总计算
  255. if (e.field == "Amount") {
  256. var s = "<span style='color:Brown;'>"
  257. s += "合计:" + totalPayment
  258. + "</span>";
  259. e.cellHtml = s;
  260. }
  261. else if (e.field == "AllOrder") {
  262. var s = "<span style='color:Brown;'>"
  263. s += "合计:" + allOrder
  264. + "</span>";
  265. e.cellHtml = s;
  266. }
  267. else if (e.field == "WaitDesign") {
  268. var s = "<span style='color:Brown;'>"
  269. s += "合计:" + wait
  270. + "</span>";
  271. e.cellHtml = s;
  272. }
  273. else if (e.field == "Designing") {
  274. var s = "<span style='color:Brown;'>"
  275. s += "合计:" + designing
  276. + "</span>";
  277. e.cellHtml = s;
  278. }
  279. else if (e.field == "DesignFinish") {
  280. var s = "<span style='color:Brown;'>"
  281. s += "合计:" + finish
  282. + "</span>";
  283. e.cellHtml = s;
  284. }
  285. else if (e.field == "FinalizationRate") {
  286. var s = "<span style='color:Brown;'>"
  287. s += "平均:" + rateAp
  288. + "</span>";
  289. e.cellHtml = s;
  290. }
  291. else if (e.field == "PayPrice") {
  292. var s = "<span style='color:Brown;'>"
  293. s += "合计:" + payPrice
  294. + "</span>";
  295. e.cellHtml = s;
  296. }
  297. }
  298. </script>
  299. </asp:Content>
  300. <asp:Content ID="Content2" ContentPlaceHolderID="btn" runat="Server">
  301. <a class="mini-button mini-button-primary" iconcls="icon-folder" onclick="exportFn()">导出</a>
  302. </asp:Content>
  303. <asp:Content ID="Content4" ContentPlaceHolderID="content" runat="Server">
  304. <div class="mini-tabs" id="miniTabs" activeindex="0" style="width: 98%;">
  305. <div title="总表分析">
  306. <div style="display: flex; flex-direction: column; gap: 10px">
  307. <div style="display: flex; gap: 10px">
  308. <div id="total_shop_grid_panel" class="mini-panel mini-panel-info" title="店铺" style="width: 50%; padding: 0px">
  309. <div id="total_shop_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  310. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_shop_gather">
  311. <div property="columns">
  312. <div field="shopName" width="60" align="center" headeralign="center">店铺名称</div>
  313. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">成交单量</div>
  314. <div field="aftersaleOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  315. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  316. <div field="rateProp" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  317. <div field="checkout" datatype="int" width="60" align="center" headeralign="center" allowsort="true">查货超时</div>
  318. </div>
  319. </div>
  320. </div>
  321. <div id="total_goods_grid_panel" class="mini-panel mini-panel-info" title="产品" style="width: 50%; padding: 0px">
  322. <div id="total_goods_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  323. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_goods_gather">
  324. <div property="columns">
  325. <div field="goodsName" width="60" align="center" headeralign="center">产品名称</div>
  326. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">成交单量</div>
  327. <div field="aftersaleOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  328. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  329. <div field="rateProp" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. <div style="display: flex; gap: 10px">
  335. <div id="total_dutyce_grid_panel" class="mini-panel mini-panel-info" title="部门" style="width: 50%; padding: 0px">
  336. <div id="total_dutyce_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  337. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_dutyce_gather">
  338. <div property="columns">
  339. <div field="AfterSaleReason" width="60" align="center" headeralign="center">部门名称</div>
  340. <div field="total" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  341. <div field="all" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后总量</div>
  342. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  343. </div>
  344. </div>
  345. </div>
  346. <div id="total_sale_grid_panel" class="mini-panel mini-panel-info" title="售后" style="width: 50%; padding: 0px">
  347. <div id="total_sale_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  348. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_gather">
  349. <div property="columns">
  350. <div field="DesignerName" width="60" align="center" headeralign="center">售后员</div>
  351. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">总数量</div>
  352. <div field="Handling" datatype="int" width="60" align="center" headeralign="center" allowsort="true">处理中</div>
  353. <div field="Finish" datatype="int" width="60" align="center" headeralign="center" allowsort="true">已完成</div>
  354. <div field="ChangeNum" datatype="int" width="60" align="center" headeralign="center" allowsort="true">判责错误数</div>
  355. <div field="DisagreeTime" datatype="int" width="60" align="center" headeralign="center" allowsort="true">打回超时</div>
  356. <div field="PreTimeOut" datatype="int" width="60" align="center" headeralign="center" allowsort="true">未处理超时</div>
  357. <div field="ReprintOut" datatype="int" width="60" align="center" headeralign="center" allowsort="true">跟单超时</div>
  358. <div field="BackRate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">打回率</div>
  359. </div>
  360. </div>
  361. </div>
  362. </div>
  363. <div style="display: flex; gap: 10px">
  364. <div id="total_org_design_grid_panel" class="mini-panel mini-panel-info" title="设计部门" style="width: 50%; padding: 0px">
  365. <div id="total_org_design_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  366. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_org_design_gather">
  367. <div property="columns">
  368. <div field="OrgName" width="60" align="center" headeralign="center">部门名称</div>
  369. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">成交单量</div>
  370. <div field="aftersaleOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  371. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  372. <div field="rateProp" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  373. </div>
  374. </div>
  375. </div>
  376. <div id="total_org_custom_grid_panel" class="mini-panel mini-panel-info" title="客服部门" style="width: 50%; padding: 0px">
  377. <div id="total_org_custom_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  378. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_org_custom_gather">
  379. <div property="columns">
  380. <div field="OrgName" width="60" align="center" headeralign="center">部门名称</div>
  381. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">成交单量</div>
  382. <div field="aftersaleOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  383. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  384. <div field="rateProp" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. <div style="display: flex; gap: 10px">
  390. <div id="total_reason_grid_panel" class="mini-panel mini-panel-info" title="原因" style="width: 50%; padding: 0px">
  391. <div id="total_reason_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  392. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_reason_gather">
  393. <div property="columns">
  394. <div field="AfterSaleReason1" name="AfterSaleReason1" width="60" align="center" headeralign="center" allowsort="true">一级原因</div>
  395. <div field="AfterSaleReason2" name="AfterSaleReason2" datatype="int" width="60" align="center" headeralign="center" allowsort="true">二级原因</div>
  396. <div field="AfterSaleReason3" name="AfterSaleReason3" datatype="int" width="60" align="center" headeralign="center" allowsort="true">三级原因</div>
  397. <div field="total" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  398. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后占比</div>
  399. </div>
  400. </div>
  401. </div>
  402. </div>
  403. </div>
  404. </div>
  405. <div title="车间">
  406. <div style="display: flex; gap: 10px">
  407. <div id="sup_goods_grid_panel" class="mini-panel mini-panel-info" title="同产品不同车间对比" style="width: 50%; padding: 0px">
  408. <div id="sup_goods_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  409. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_sup_goods_gather">
  410. <div property="columns">
  411. <div field="goodsName" name="goodsName" width="60" align="center" headeralign="center">产品名称</div>
  412. <div field="ComName" name="ComName" datatype="int" width="60" align="center" headeralign="center" allowsort="true">车间名称</div>
  413. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">下单单量</div>
  414. <div field="aftersaleOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  415. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  416. </div>
  417. </div>
  418. </div>
  419. <div id="sup_after_grid_panel" class="mini-panel mini-panel-info" title="售后原因" style="width: 50%; padding: 0px">
  420. <div id="sup_after_grid" class="mini-datagrid panel" sortmode="client" style="width: 100%; height: 300px;" showemptytext="true" showpager="false" ondrawsummarycell="onDrawSummaryCell"
  421. emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_aftersale_sup_gather">
  422. <div property="columns">
  423. <div field="ComName" name="ComName" width="60" align="center" headeralign="center">车间名称</div>
  424. <div field="AfterSaleReason1" name="AfterSaleReason1" datatype="int" width="60" align="center" headeralign="center" allowsort="true">原因1</div>
  425. <div field="AfterSaleReason2" name="AfterSaleReason2" datatype="int" width="60" align="center" headeralign="center" allowsort="true">原因2</div>
  426. <div field="AfterSaleReason3" name="AfterSaleReason3" datatype="int" width="60" align="center" headeralign="center" allowsort="true">原因3</div>
  427. <div field="AllOrder" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后数量</div>
  428. <div field="rate" datatype="int" width="60" align="center" headeralign="center" allowsort="true">售后率</div>
  429. </div>
  430. </div>
  431. </div>
  432. </div>
  433. </div>
  434. </div>
  435. </asp:Content>