浏览代码

Merge branch 'master' of http://git.iamberry.com/hexiugang/iamberry-common-parent

liujiankang 7 年之前
父节点
当前提交
4fc3741be4
共有 36 个文件被更改,包括 88807 次插入17 次删除
  1. 10 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintQuestionInfo.java
  2. 22 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintSmallClassInfo.java
  3. 22 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintTypeInfo.java
  4. 31 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/cm/CustomerInfo.java
  5. 2 2
      watero-rst-core/src/main/java/com.iamberry.rst.core/cm/QuestionDescribe.java
  6. 7 0
      watero-rst-interface/src/main/java/com/iamberry/rst/faces/cm/ComplaintTypeInfoService.java
  7. 3 1
      watero-rst-interface/src/main/java/com/iamberry/rst/faces/cm/CustomerService.java
  8. 3 0
      watero-rst-interface/src/main/java/com/iamberry/rst/faces/pts/MachineService.java
  9. 5 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/ComplaintTypeInfoServiceImpl.java
  10. 5 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/CustomerServiceImpl.java
  11. 13 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/ComplaintTypeInfoMapper.java
  12. 3 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/CustomerInfoMapper.java
  13. 79 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/complaintTypeInfoMapper.xml
  14. 25 2
      watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/customerInfoMapper.xml
  15. 5 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/MachineServiceImpl.java
  16. 3 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/MachineMapper.java
  17. 15 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/machineMapper.xml
  18. 182 0
      watero-rst-web/src/main/java/com/iamberry/rst/controllers/cm/AdminCustomerReportController.java
  19. 42 0
      watero-rst-web/src/main/java/com/iamberry/rst/controllers/cm/AdminSignclosedController.java
  20. 2 1
      watero-rst-web/src/main/webapp/WEB-INF/views/cm/customer/add_customer.ftl
  21. 18 11
      watero-rst-web/src/main/webapp/WEB-INF/views/cm/customer/custome_detail.ftl
  22. 123 0
      watero-rst-web/src/main/webapp/WEB-INF/views/cm/report/customer_picChart.ftl
  23. 316 0
      watero-rst-web/src/main/webapp/WEB-INF/views/cm/report/customer_report.ftl
  24. 1 0
      watero-rst-web/src/main/webapp/WEB-INF/views/order/excel_to_order.ftl
  25. 1 0
      watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.common.min.js
  26. 74771 0
      watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.js
  27. 1 0
      watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.min.js
  28. 198 0
      watero-rst-web/src/main/webapp/common/lib/echarts/3.8/macarons.js
  29. 484 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/css/select2.css
  30. 1 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/css/select2.min.css
  31. 3 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/i18n/en.js
  32. 3 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/i18n/zh-CN.js
  33. 6559 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.full.js
  34. 1 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.full.min.js
  35. 5847 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.js
  36. 1 0
      watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.min.js

+ 10 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintQuestionInfo.java

@@ -26,6 +26,8 @@ public class ComplaintQuestionInfo implements Serializable {
     private Integer complaintId; //问题分类id
     private Integer complaintType;//咨询类型 1.售前 2.售后 3.其它
 
+    private Integer questionNum; //数量
+
     public Integer getQuestionId() {
         return questionId;
     }
@@ -121,4 +123,12 @@ public class ComplaintQuestionInfo implements Serializable {
     public void setComplaintType(Integer complaintType) {
         this.complaintType = complaintType;
     }
+
+    public Integer getQuestionNum() {
+        return questionNum;
+    }
+
+    public void setQuestionNum(Integer questionNum) {
+        this.questionNum = questionNum;
+    }
 }

+ 22 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintSmallClassInfo.java

@@ -1,7 +1,9 @@
 package com.iamberry.rst.core.cm;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 客诉小类表
@@ -21,6 +23,10 @@ public class ComplaintSmallClassInfo implements Serializable {
     private Date smallClassCreateTime;           //创建时间
     private Date smallClassUpdateTime;           //修改时间
 
+    private Integer smallClassNum; //数量
+
+    private List<ComplaintQuestionInfo> questionInfoList = new ArrayList<ComplaintQuestionInfo>();
+
     public Integer getSmallClassId() {
         return smallClassId;
     }
@@ -84,4 +90,20 @@ public class ComplaintSmallClassInfo implements Serializable {
     public void setSmallClassUpdateTime(Date smallClassUpdateTime) {
         this.smallClassUpdateTime = smallClassUpdateTime;
     }
+
+    public List<ComplaintQuestionInfo> getQuestionInfoList() {
+        return questionInfoList;
+    }
+
+    public void setQuestionInfoList(List<ComplaintQuestionInfo> questionInfoList) {
+        this.questionInfoList = questionInfoList;
+    }
+
+    public Integer getSmallClassNum() {
+        return smallClassNum;
+    }
+
+    public void setSmallClassNum(Integer smallClassNum) {
+        this.smallClassNum = smallClassNum;
+    }
 }

+ 22 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/cm/ComplaintTypeInfo.java

@@ -1,7 +1,9 @@
 package com.iamberry.rst.core.cm;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 客诉类型表
@@ -19,6 +21,10 @@ public class ComplaintTypeInfo implements Serializable {
     private Date complaintCreateTime;      //创建时间
     private Date complaintUpdateTime;      //修改时间
 
+    private Integer complaintNum;       //查询数量
+
+    private List<ComplaintSmallClassInfo> smallClassInfoList = new ArrayList<ComplaintSmallClassInfo>();
+
     public Integer getComplaintId() {
         return complaintId;
     }
@@ -74,4 +80,20 @@ public class ComplaintTypeInfo implements Serializable {
     public void setComplaintUpdateTime(Date complaintUpdateTime) {
         this.complaintUpdateTime = complaintUpdateTime;
     }
+
+    public List<ComplaintSmallClassInfo> getSmallClassInfoList() {
+        return smallClassInfoList;
+    }
+
+    public void setSmallClassInfoList(List<ComplaintSmallClassInfo> smallClassInfoList) {
+        this.smallClassInfoList = smallClassInfoList;
+    }
+
+    public Integer getComplaintNum() {
+        return complaintNum;
+    }
+
+    public void setComplaintNum(Integer complaintNum) {
+        this.complaintNum = complaintNum;
+    }
 }

+ 31 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/cm/CustomerInfo.java

@@ -108,6 +108,13 @@ public class CustomerInfo  implements Serializable {
         return complaintDetectList;
     }
 
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
+    private Date startTime;  //开始时间
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
+    private Date endTime;   //结束时间
+
     public void setComplaintDetectList(List<ComplaintDetectInfo> complaintDetectList) {
         this.complaintDetectList = complaintDetectList;
     }
@@ -511,4 +518,28 @@ public class CustomerInfo  implements Serializable {
     public void setVisitDesignatedAdminId(Integer visitDesignatedAdminId) {
         this.visitDesignatedAdminId = visitDesignatedAdminId;
     }
+
+    public String getVisitDesignatedAdminName() {
+        return visitDesignatedAdminName;
+    }
+
+    public void setVisitDesignatedAdminName(String visitDesignatedAdminName) {
+        this.visitDesignatedAdminName = visitDesignatedAdminName;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
 }

+ 2 - 2
watero-rst-core/src/main/java/com.iamberry.rst.core/cm/QuestionDescribe.java

@@ -10,12 +10,12 @@ public class QuestionDescribe implements Serializable {
     private static final long serialVersionUID = -3855353499616091790L;
     //   问题描述id
     private Integer describeId;
-    //   描述  
+    //   描述 --> 问题回复
     private String describeContent;
     //   客诉主键  ,
     private Integer customerId;
 
-    //处理描述:用于新建客诉的时候的处理描述
+    //处理描述:用于新建客诉的时候的处理描述----> 客服备注 --> 问题描述
     private String describeHandleDesc;
 
     private String describeTitle;   //客诉标题

+ 7 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/cm/ComplaintTypeInfoService.java

@@ -1,5 +1,6 @@
 package com.iamberry.rst.faces.cm;
 
+import com.iamberry.rst.core.cm.ComplaintQuestionInfo;
 import com.iamberry.rst.core.cm.ComplaintTypeInfo;
 
 import java.util.List;
@@ -27,4 +28,10 @@ public interface ComplaintTypeInfoService {
     /*查询问题分类*/
     List<ComplaintTypeInfo> listComplaintTypeInfo(ComplaintTypeInfo complaintTypeInfo);
 
+    /**
+     * 查询客诉结构
+     * @return
+     */
+    List<ComplaintTypeInfo> listComplaintQuestionToReport(ComplaintTypeInfo complaintTypeInfo);
+
 }

+ 3 - 1
watero-rst-interface/src/main/java/com/iamberry/rst/faces/cm/CustomerService.java

@@ -131,6 +131,8 @@ public interface CustomerService {
      * 向Efast推送订单  仅换新,维修 ,补发
      * @return
      */
-    @Transactional
     Map<String,Object> sendEfastOrder(CustomerCommon customerCommon,SalesOrder salesOrder);
+
+    /*查询问题个数*/
+    Integer getQuestionNumber(CustomerInfo customerInfo);
 }

+ 3 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/pts/MachineService.java

@@ -50,6 +50,9 @@ public interface MachineService {
     //机器集合
     List<PtsMachine> ListPtsMachine(PtsMachine ptsMachine);
 
+    //机器集合--> 仓储查询机器
+    List<PtsMachine> ListPtsMachineToSignclosed(PtsMachine ptsMachine);
+
     //获取单个机器生产流程日志
     List<PtsMachineLogs> listMachineLogs(Integer machineId);
 

+ 5 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/ComplaintTypeInfoServiceImpl.java

@@ -37,4 +37,9 @@ public class ComplaintTypeInfoServiceImpl implements ComplaintTypeInfoService {
     public List<ComplaintTypeInfo> listComplaintTypeInfo(ComplaintTypeInfo complaintTypeInfo) {
         return complaintTypeInfoMapper.listComplaintTypeInfo(complaintTypeInfo);
     }
+
+    @Override
+    public List<ComplaintTypeInfo> listComplaintQuestionToReport(ComplaintTypeInfo complaintTypeInfo) {
+        return complaintTypeInfoMapper.listComplaintQuestionToReport(complaintTypeInfo);
+    }
 }

+ 5 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/CustomerServiceImpl.java

@@ -498,6 +498,11 @@ public class CustomerServiceImpl implements CustomerService {
         return map;
     }
 
+    @Override
+    public Integer getQuestionNumber(CustomerInfo customerInfo) {
+        return customerInfoMapper.getQuestionNumber(customerInfo);
+    }
+
     /**
      * 向Efast推送订单--添加订单
      * @return

+ 13 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/ComplaintTypeInfoMapper.java

@@ -10,23 +10,36 @@ import java.util.List;
 public interface ComplaintTypeInfoMapper {
     /**
      * 添加单个客诉类型
+     *
      * @return
      */
     int insert(ComplaintTypeInfo record);
+
     /**
      * 查询单个客诉类型
+     *
      * @return
      */
     ComplaintTypeInfo getTypeById(Integer complaintId);
+
     /**
      * 修改单个客诉类型
+     *
      * @return
      */
     int updateTypeById(ComplaintTypeInfo record);
 
     /**
      * 查询所有客诉类型
+     *
      * @return
      */
     List<ComplaintTypeInfo> listComplaintTypeInfo(ComplaintTypeInfo complaintTypeInfo);
+
+    /**
+     * 查询客诉结构
+     *
+     * @return
+     */
+    List<ComplaintTypeInfo> listComplaintQuestionToReport(ComplaintTypeInfo complaintTypeInfo);
 }

+ 3 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/CustomerInfoMapper.java

@@ -38,4 +38,7 @@ public interface CustomerInfoMapper {
      * @return
      */
     ProductType getcompanyAffiliation(Integer customerId);
+
+    /*查询问题个数*/
+    Integer getQuestionNumber(CustomerInfo customerInfo);
 }

+ 79 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/complaintTypeInfoMapper.xml

@@ -68,4 +68,83 @@
     </set>
     where complaint_id = #{complaintId,jdbcType=INTEGER}
   </update>
+
+  <resultMap id="questionMap" type="ComplaintTypeInfo" >
+    <id column="complaintId" property="complaintId"  />
+    <result column="complaint_consulting_type" property="complaintConsultingType"  />
+    <result column="complaint_class_name" property="complaintClassName" />
+    <result column="complaint_class_profile" property="complaintClassProfile"  />
+    <result column="complaint_class_state" property="complaintClassState" />
+    <result column="complaint_create_time" property="complaintCreateTime"  />
+    <result column="complaint_update_time" property="complaintUpdateTime" />
+    <collection property="smallClassInfoList" column="complaintId" javaType="ArrayList"
+                ofType="com.iamberry.rst.core.cm.ComplaintSmallClassInfo" select="getListComplaintSmallClassInfo"/>
+  </resultMap>
+  <resultMap id="complaintSmallClassInfoMap" type="ComplaintSmallClassInfo" >
+    <id column="smallClassId" property="smallClassId"  />
+    <result column="complaint_id" property="complaintId"  />
+    <result column="small_class_name" property="smallClassName" />
+    <result column="small_class_profile" property="smallClassProfile"  />
+    <result column="small_class_state" property="smallClassState"  />
+    <result column="small_question_num" property="smallQuestionNum"  />
+    <result column="small_class_create_time" property="smallClassCreateTime"  />
+    <result column="small_class_update_time" property="smallClassUpdateTime"  />
+    <collection property="questionInfoList" column="smallClassId" javaType="ArrayList"
+                ofType="com.iamberry.rst.core.cm.ComplaintQuestionInfo" select="getListComplaintQuestionInfo"/>
+  </resultMap>
+  <resultMap id="complaintQuestionInfoMap" type="ComplaintQuestionInfo" >
+    <id column="question_id" property="questionId"  />
+    <result column="small_class_id" property="smallClassId"  />
+    <result column="question_name" property="questionName"  />
+    <result column="question_state" property="questionState"  />
+    <result column="question_is_qc_detect" property="questionIsQcDetect"  />
+    <result column="question_create_time" property="questionCreateTime"  />
+    <result column="question_update_time" property="questionUpdateTime" />
+    <result column="question_resolved_num" property="questionResolvedNum"  />
+    <result column="question_not_solved_num" property="questionNotSolvedNum"  />
+  </resultMap>
+  <select id="listComplaintQuestionToReport" resultMap="questionMap" parameterType="ComplaintTypeInfo" >
+    select
+      complaint_id AS complaintId,
+      complaint_consulting_type,
+      complaint_class_name,
+      complaint_class_profile,
+      complaint_class_state,
+      complaint_create_time,
+      complaint_update_time
+    from tb_rst_complaint_type
+  </select>
+  <select id="getListComplaintSmallClassInfo" resultMap="complaintSmallClassInfoMap" parameterType="java.lang.Integer" >
+    select
+      small_class_id AS smallClassId,
+      complaint_id,
+      small_class_name,
+      small_class_profile,
+      small_class_state,
+      small_question_num,
+      small_class_create_time,
+      small_class_update_time
+    from tb_rst_complaint_small_class
+    where
+      complaint_id = #{complaintId}
+  </select>
+  <select id="getListComplaintQuestionInfo" resultMap="complaintQuestionInfoMap" parameterType="java.lang.Integer" >
+    select
+      cq.question_id,
+      cq.small_class_id,
+      cq.question_name,
+      cq.question_state,
+      cq.question_is_qc_detect,
+      cq.question_resolved_num,
+      cq.question_not_solved_num,
+      cq.question_create_time,
+      cq.question_update_time,
+      COUNT(ci.customer_id) AS questionNum
+    from tb_rst_complaint_question cq
+    LEFT JOIN tb_rst_customer_info ci ON cq.question_id = ci.question_id
+    where
+      cq.small_class_id = #{smallClassId}
+    GROUP BY cq.question_id
+  </select>
+
 </mapper>

+ 25 - 2
watero-rst-service/src/main/java/com/iamberry/rst/service/cm/mapper/customerInfoMapper.xml

@@ -68,8 +68,10 @@
       v.visit_time_select,
       v.visit_complete_name,
       v.visit_complete_tel,
+      sa.admin_name AS  visitDesignatedAdminName,
       q.question_profile,
-      d.describe_handle_desc
+      d.describe_handle_desc,
+      d.describe_content
     from
       tb_rst_customer_info c
     LEFT JOIN tb_rst_question_describe d ON c.customer_id = d.customer_id
@@ -79,8 +81,9 @@
     LEFT JOIN tb_rst_complaint_type ct ON s.complaint_id = ct.complaint_id
     LEFT JOIN tb_rst_sales_company sc ON c.company_id = sc.company_id
     LEFT JOIN tb_rst_store_info si ON c.store_id = si.store_id
+    LEFT JOIN tb_rst_sys_admin a ON c.admin_id = a.admin_id
     LEFT JOIN tb_rst_visit v ON v.customer_id = c.customer_id
-    LEFT JOIN tb_rst_sys_admin a ON v.designated_admin_id = a.admin_id
+    LEFT JOIN tb_rst_sys_admin sa ON v.designated_admin_id = sa.admin_id
     <where>
       <if test="customerName != null and customerName != ''">
         c.customer_name like CONCAT('%',#{customerName},'%')
@@ -149,6 +152,7 @@
     <result column="visit_complete_tel" property="visitCompleteTel"/>
     <result column="question_profile" property="questionProfile"/>
     <result column="describe_handle_desc" property="describeHandleDesc"/>
+    <result column="describe_content" property="describeContent"/>
     <collection property="complaintDetectList" column="customer_id" ofType="ComplaintDetectInfo" select="listComplaintDetect"/>
   </resultMap>
 
@@ -242,4 +246,23 @@
     where
     ci.customer_id = #{customerId}
   </select>
+
+  <select id="getQuestionNumber" parameterType="CustomerInfo" resultType="Integer">
+      SELECT
+        COUNT(customer_id)
+      FROM
+        tb_rst_customer_info
+      <where>
+        <if test="questionId != null" >
+           question_id = #{questionId}
+        </if>
+        <if test="startTime!=null and startTime!='' ">
+           and customer_create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime!=null and endTime!=''">
+           and customer_create_time &lt;= #{endTime}
+        </if>
+      </where>
+  </select>
+
 </mapper>

+ 5 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/MachineServiceImpl.java

@@ -75,6 +75,11 @@ public class MachineServiceImpl implements MachineService {
     }
 
     @Override
+    public List<PtsMachine> ListPtsMachineToSignclosed(PtsMachine ptsMachine) {
+        return machineMapper.ListPtsMachineToSignclosed(ptsMachine);
+    }
+
+    @Override
     public List<PtsMachine> listMachineWebApp(PtsMachine ptsMachine) {
         return machineMapper.listMachineWebApp(ptsMachine);
     }

+ 3 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/MachineMapper.java

@@ -25,6 +25,9 @@ public interface MachineMapper {
     //查询机器列表
     List<PtsMachine> listMachine(PtsMachine ptsMachine);
 
+    //机器集合--> 仓储查询机器
+    List<PtsMachine> ListPtsMachineToSignclosed(PtsMachine ptsMachine);
+
     //查询机器列表--webapp
     List<PtsMachine> listMachineWebApp(PtsMachine ptsMachine);
 

+ 15 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/machineMapper.xml

@@ -120,6 +120,21 @@
         order by machine_create_time desc
     </select>
 
+    <select id="ListPtsMachineToSignclosed" parameterType="PtsMachine" resultType="PtsMachine">
+        SELECT
+        t.machine_id machineId,
+        t.machine_qrcode machineQrcode,
+        t.machine_barcode machineBarcode
+        FROM  tb_rst_pts_machine t
+        <where>
+            <if test="machineBarcode != null and machineBarcode != ''">
+                t.machine_barcode like CONCAT('%',#{machineBarcode},'%')
+            </if>
+        </where>
+        order by machine_create_time desc
+        LIMIT 0,10;
+    </select>
+
 
     <select id="listMachineWebApp" parameterType="PtsMachine" resultType="PtsMachine">
         SELECT

+ 182 - 0
watero-rst-web/src/main/java/com/iamberry/rst/controllers/cm/AdminCustomerReportController.java

@@ -0,0 +1,182 @@
+package com.iamberry.rst.controllers.cm;
+
+import com.iamberry.rst.core.cm.*;
+import com.iamberry.rst.faces.cm.ComplaintSmallClassInfoService;
+import com.iamberry.rst.faces.cm.ComplaintTypeInfoService;
+import com.iamberry.rst.faces.cm.CustomerService;
+import com.iamberry.wechat.tools.ResponseJson;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.xml.crypto.Data;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 客诉统计
+ * @auto wxm
+ */
+@Controller
+@RequestMapping("/admin/customer_report")
+public class AdminCustomerReportController {
+
+    private Logger logger = LoggerFactory.getLogger(AdminCustomerController.class);
+
+    @Autowired
+    private ComplaintTypeInfoService complaintTypeInfoService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private ComplaintSmallClassInfoService complaintSmallClassInfoService;
+
+    /**
+     * 客诉问题统计
+     *
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("customer:question:report")
+    @RequestMapping(value = "/question_statistics")
+    public ResponseJson listStoreInfo(HttpServletRequest request,CustomerInfo customerInfo) {
+        ComplaintTypeInfo complaintTypeInfo = new ComplaintTypeInfo();
+        List<ComplaintTypeInfo> complaintTypeInfoList = complaintTypeInfoService.listComplaintQuestionToReport(complaintTypeInfo);
+        Integer num = 0;
+        for(int i=0;i<complaintTypeInfoList.size();i++){
+            Integer complaintTypeNum = 0;
+            ComplaintTypeInfo type = complaintTypeInfoList.get(i);
+            for(int j=0;j<type.getSmallClassInfoList().size();j++){
+                Integer smallClassNum = 0;
+                ComplaintSmallClassInfo small = type.getSmallClassInfoList().get(j);
+                for(int k=0;k<small.getQuestionInfoList().size();k++){
+                    Integer questionNum = 0;
+                    ComplaintQuestionInfo questionInfo = small.getQuestionInfoList().get(k);
+                    customerInfo.setQuestionId(questionInfo.getQuestionId());
+                    questionNum = customerService.getQuestionNumber(customerInfo);
+                    smallClassNum += questionNum;
+                    small.getQuestionInfoList().get(k).setQuestionNum(questionNum);
+                }
+                complaintTypeNum += smallClassNum;
+                type.getSmallClassInfoList().get(j).setSmallClassNum(smallClassNum);
+            }
+            num += complaintTypeNum;
+            complaintTypeInfoList.get(i).setComplaintNum(complaintTypeNum);
+        }
+
+        ResponseJson rj = new ResponseJson(200, "查询成功", 200);
+        rj.addResponseKeyValue("complaintTypeInfoList",complaintTypeInfoList);
+        rj.addResponseKeyValue("num",num);
+        return rj;
+    }
+
+    /**
+     * 跳转到报表页面
+     * @param request
+     * @return
+     */
+    @RequiresPermissions("customer:question:report")
+    @RequestMapping(value = "/to_statistics")
+    public ModelAndView selectOrder(HttpServletRequest request) {
+        ModelAndView mv = new ModelAndView("/cm/report/customer_report");
+        return mv;
+    }
+
+    /**
+     * 跳转到客诉问题分布展示页面
+     * @param request
+     * @return
+     */
+    @RequiresPermissions("customer:question:report")
+    @RequestMapping(value = "/show_pie_chart")
+    public ModelAndView showPieChart(HttpServletRequest request,String id,String typeName,String startTime,String endTime) {
+        ModelAndView mv = new ModelAndView("/cm/report/customer_picChart");
+        mv.addObject("id",id);
+        mv.addObject("typeName",typeName);
+        mv.addObject("startTime",startTime);
+        mv.addObject("endTime",endTime);
+        return mv;
+    }
+
+    /**
+     * 客诉问题分布展示
+     *
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("customer:question:report")
+    @RequestMapping(value = "/get_pic_chart_data")
+    public ResponseJson getPicChartData(HttpServletRequest request,String id,String typeName,String startTime,String endTime) throws Exception {
+        CustomerInfo customerInfo = new CustomerInfo();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDate = dateFormat.parse(startTime);
+        Date endDate = dateFormat.parse(endTime);
+        customerInfo.setStartTime(startDate);
+        customerInfo.setEndTime(endDate);
+
+        List dataList = new ArrayList<>();
+        List nameList = new ArrayList<>();
+        String name = "";
+        ComplaintTypeInfo complaintTypeInfo = new ComplaintTypeInfo();
+        List<ComplaintTypeInfo> complaintTypeInfoList = complaintTypeInfoService.listComplaintQuestionToReport(complaintTypeInfo);
+        Integer num = 0;
+        for(int i=0;i<complaintTypeInfoList.size();i++){
+            Integer complaintTypeNum = 0;
+            ComplaintTypeInfo type = complaintTypeInfoList.get(i);
+            for(int j=0;j<type.getSmallClassInfoList().size();j++){
+                Integer smallClassNum = 0;
+                ComplaintSmallClassInfo small = type.getSmallClassInfoList().get(j);
+                for(int k=0;k<small.getQuestionInfoList().size();k++){
+                    Integer questionNum = 0;
+                    ComplaintQuestionInfo questionInfo = small.getQuestionInfoList().get(k);
+                    customerInfo.setQuestionId(questionInfo.getQuestionId());
+                    questionNum = customerService.getQuestionNumber(customerInfo);
+                    smallClassNum += questionNum;
+                    small.getQuestionInfoList().get(k).setQuestionNum(questionNum);
+                    if("small".equals(typeName) && questionInfo.getSmallClassId() == Integer.valueOf(id) && questionNum!=0){
+                        Map<String ,Object> map = new HashMap<>();
+                        map.put("name",questionInfo.getQuestionName());
+                        map.put("value",questionNum);
+                        dataList.add(map);
+                        name = small.getSmallClassName();
+                        nameList.add(questionInfo.getQuestionName());
+                    }
+                }
+                complaintTypeNum += smallClassNum;
+                type.getSmallClassInfoList().get(j).setSmallClassNum(smallClassNum);
+                if("type".equals(typeName) && small.getComplaintId() == Integer.valueOf(id) && smallClassNum!=0){
+                    Map<String ,Object> map = new HashMap<>();
+                    map.put("name",small.getSmallClassName());
+                    map.put("value",smallClassNum);
+                    dataList.add(map);
+                    name = type.getComplaintClassName();
+                    nameList.add(small.getSmallClassName());
+                }
+            }
+            num += complaintTypeNum;
+            complaintTypeInfoList.get(i).setComplaintNum(complaintTypeNum);
+        }
+
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
+        String startValue = formatter.format(startDate);
+        String endValue = formatter.format(endDate);
+        String dateValue = startValue + "-" + endValue;
+
+        ResponseJson rj = new ResponseJson(200, "查询成功", 200);
+        rj.addResponseKeyValue("dataList",dataList);
+        rj.addResponseKeyValue("nameList",nameList);
+        rj.addResponseKeyValue("name",name);
+        rj.addResponseKeyValue("startTime",startTime);
+        rj.addResponseKeyValue("endTime",endTime);
+        rj.addResponseKeyValue("dateValue",dateValue);
+        return rj;
+    }
+}

+ 42 - 0
watero-rst-web/src/main/java/com/iamberry/rst/controllers/cm/AdminSignclosedController.java

@@ -4,11 +4,13 @@ import com.iamberry.rst.core.cm.*;
 import com.iamberry.rst.core.order.Product;
 import com.iamberry.rst.core.page.PageRequest;
 import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.core.pts.PtsMachine;
 import com.iamberry.rst.faces.cm.AwaitingSignclosedProductInfoService;
 import com.iamberry.rst.faces.cm.ComplaintDetectInfoService;
 import com.iamberry.rst.faces.cm.ComplaintSignclosedInfoService;
 import com.iamberry.rst.faces.cm.FittingsInfoService;
 import com.iamberry.rst.faces.product.ProductService;
+import com.iamberry.rst.faces.pts.MachineService;
 import com.iamberry.rst.service.cm.mapper.AwaitingSignclosedProductMapper;
 import com.iamberry.rst.service.cm.mapper.ComplaintSignclosedInfoMapper;
 import com.iamberry.rst.service.cm.mapper.ComplaintSignclosedProductInfoMapper;
@@ -45,6 +47,9 @@ public class AdminSignclosedController {
     private ComplaintSignclosedInfoService complaintSignclosedInfoService;
     @Autowired
     private AwaitingSignclosedProductInfoService awaitingSignclosedProductInfoService;
+    @Autowired
+    private MachineService machineService;
+
     /**
      * 跳转到添加签收记录页面
      *
@@ -98,6 +103,43 @@ public class AdminSignclosedController {
         return mv;
     }
 
+
+    /**
+     * 获取机器信息
+     * @param
+     * @return
+     * @throws Exception
+     */
+    @ResponseBody
+    @RequiresPermissions("signclosed:add:signclosed")
+    @RequestMapping("/get_machine_id")
+    public ResponseJson getMachineId(@RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize,
+                                     @RequestParam(value = "pageNO", defaultValue = "1", required = false) Integer pageNO,
+                                     @RequestParam(value = "pageTotal", required = false) Integer pageTotal,
+                                     PtsMachine ptsMachine) throws Exception {
+        ResponseJson rj = new ResponseJson();
+        List<PtsMachine> ptsMachineList = machineService.ListPtsMachineToSignclosed(ptsMachine);
+
+        List results = new ArrayList();
+        for (PtsMachine machine : ptsMachineList){
+            Map<String,Object> m = new HashMap<String,Object>();
+            m.put("id",machine.getMachineId());
+            m.put("text",machine.getMachineBarcode());
+            results.add(m);
+        }
+
+//        Map<String,Object> paginationMap = new HashMap<String,Object>();
+//        paginationMap.put("more",true);
+//
+//        Map<String,Object> map = new HashMap<String,Object>();
+//        map.put("results",results);
+//        map.put("pagination",paginationMap);
+//
+//        rj.addResponseKeyValue("map",map);
+        rj.addResponseKeyValue("results",results);
+        return rj;
+    }
+
     /**
      * 添加签收信息
      * @param request

+ 2 - 1
watero-rst-web/src/main/webapp/WEB-INF/views/cm/customer/add_customer.ftl

@@ -677,7 +677,8 @@
         toolbars: [tool],
         autoHeightEnabled: true,
         autoFloatEnabled: true,
-        elementPathEnabled : false  /*去掉元素路径*/
+        elementPathEnabled : false,  /*去掉元素路径*/
+        zIndex : 5
     });
     /*邮寄地址*/
     var sendAddressSms = UE.getEditor('sendAddressSms', {

+ 18 - 11
watero-rst-web/src/main/webapp/WEB-INF/views/cm/customer/custome_detail.ftl

@@ -87,13 +87,19 @@
             </div>
         </div>
         <div class="row cl">
-            <label class="form-label col-1 col-sm-1">回复内容:</label>
+            <label class="form-label col-1 col-sm-1">问题描述:</label>
             <div class="formControls col-5 col-sm-5">
                 <label id="questionProfile"></label>
             </div>
         </div>
         <div class="row cl">
-            <label class="form-label col-1 col-sm-1">用户信息:</label>
+            <label class="form-label col-1 col-sm-1">问题回复:</label>
+            <div class="formControls col-5 col-sm-5">
+                <label id="describeContent"></label>
+            </div>
+        </div>
+        <div class="row cl">
+            <label class="form-label col-1 col-sm-1">用户信息:</label>
             <div class="formControls col-5 col-sm-5" style="margin-top: 2px;">
                 <label id="customerName"></label>
                 <label id="customerTel"></label>
@@ -125,7 +131,7 @@
                 </div>
             </div>
             <div class="row cl">
-                <label class="form-label col-1 col-sm-1">订单信息</label>
+                <label class="form-label col-1 col-sm-1">订单信息</label>
                 <div class="formControls col-7 col-sm-7 text-c">
                     <table class="table table-border table-bg table-bordered">
                         <tr>
@@ -180,7 +186,7 @@
             </div>
         </div>
 
-        <div class="row cl">
+        <div class="row cl" style="display: none">
             <label class="form-label col-1 col-sm-1">客服备注:</label>
             <div class="formControls col-7 col-sm-7" id="describeHandleDesc" style="border: 1px solid #ddd;">
             </div>
@@ -291,6 +297,7 @@
                     $('#typeName').html(customer.typeName);
                     $('#describeTitle').html(customer.describeTitle);
                     $('#questionProfile').html(customer.describeHandleDesc);
+                    $('#describeContent').html(customer.describeContent);
                     $('#customerName').html(customer.customerName);
                     $('#customerTel').html(customer.customerTel);
                     var txtcustomerIsSolve = '';
@@ -371,18 +378,18 @@
                             case 3:visitTime = '14:00-18:00';break;
                         }
                         var visitText = "";
-                        if(customer.visitStatus == 1){
-                            visitText = '(<span class="txt-red">'+convertUndefinedToEmpty(customer.visitName)+'</span>)&nbsp;&nbsp;'+
+                        if(customer.visitStatus == 1 || customer.visitStatus == 2){
+                            visitText  += '(<span class="txt-red">'+convertUndefinedToEmpty(customer.visitDesignatedAdminName)+'</span>)&nbsp;&nbsp;'+
                                     '需要在&nbsp;&nbsp;<span class="txt-red">'+convertUndefinedToEmpty(customer.visitDate)+
                                     '&nbsp;&nbsp;'+convertUndefinedToEmpty(visitTime)+'</span>对&nbsp;&nbsp;<span class="txt-red">'+
                                     convertUndefinedToEmpty(customer.visitName)+'&nbsp;&nbsp;'+
-                                    convertUndefinedToEmpty(customer.visitTel)+'</span>&nbsp;&nbsp;进行回访';
+                                    convertUndefinedToEmpty(customer.visitTel)+'</span>&nbsp;&nbsp;进行回访<br>';
 
-                    }
+                        }
                         if(customer.visitStatus == 2){
-                            visitText = '(<span class="txt-red">'+convertUndefinedToEmpty(customer.adminName)+'</span>)&nbsp;&nbsp;'+
-                                    '在&nbsp;&nbsp;<span class="txt-red">'+convertUndefinedToEmpty(customer.visitDate)+
-                                    '&nbsp;&nbsp;'+convertUndefinedToEmpty(visitTime)+'</span>对&nbsp;&nbsp;<span class="txt-red">'+
+                            visitText += '(<span class="txt-red">'+convertUndefinedToEmpty(customer.visitDesignatedAdminName)+'</span>)&nbsp;&nbsp;'+
+                                    '在&nbsp;&nbsp;<span class="txt-red">'+convertUndefinedToEmpty(customer.visitCompleteDate)+
+                                    '&nbsp;&nbsp;</span>对&nbsp;&nbsp;<span class="txt-red">'+
                                     convertUndefinedToEmpty(customer.visitCompleteName)+'&nbsp;&nbsp;'+
                                     convertUndefinedToEmpty(customer.visitCompleteTel)+'</span>&nbsp;&nbsp;完成回访';
                         }

+ 123 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/cm/report/customer_picChart.ftl

@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+    <meta http-equiv="Cache-Control" content="no-siteapp" />
+    <link rel="Bookmark" href="/favicon.ico" >
+    <link rel="Shortcut Icon" href="/favicon.ico" />
+<#include "/base/list_base.ftl">
+    <title>客诉统计</title>
+    <style>
+        *{padding: 0;margin: 0;}
+        .my-input{border: 1px solid rgba(0,0,0,.1);padding: 1px 5px;height: 32px;margin-right: 10px;}
+        .my-select{border: 1px solid rgba(0,0,0,.1);padding:6px 50px 6px 15px;height: 34px;margin: 0 10px; -webkit-appearance:none;appearance:none;background: url(${path}/common/images/pts/select-1.png) right center no-repeat;background-size:auto 100%;}
+        .my-btn-search{border: 1px solid #32a3d8;padding: 1px 25px;height: 32px;background-color: #32a3d8;color: #fff;}
+        .table-bg thead th{background-color: #e2f6ff;}
+        .update-parts>span{margin-right: 10px;padding: 3px 4px;background-color: #effaff;border: 1px solid #32a3d8;}
+        .txt2{
+            width:60px;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+        }
+    </style>
+</head>
+<body>
+<div class="page-container">
+    <div class="mt-20" id="createTable">
+        <div id="main" style="width: 800px;height:400px;"></div>
+    </div>
+</div>
+<tfoot>
+</tfoot>
+<script type="text/javascript" src="${path}/common/lib/echarts/3.8/echarts.js"></script>
+<script type="text/javascript" src="${path}/common/lib/echarts/3.8/macarons.js"></script>
+<script type="text/javascript" src="${path}/common/lib/echarts/3.8/echarts.common.min.js"></script>
+<script type="text/javascript">
+
+    $(function (){
+        /*查询统计*/
+        getPicChartData();
+    });
+
+    /**
+     * 查询统计
+     */
+    function getPicChartData() {
+        var id = '${id}';
+        var typeName = '${typeName}';
+        var startTime = '${startTime}';
+        var endTime = '${endTime}';
+        var index = layer.load(1, {
+            shade: [0.5,'#fff'] //0.1透明度的白色背景
+        });
+        $.ajax({
+            type: "POST",
+            data: {
+                id :id,
+                typeName : typeName,
+                startTime : startTime,
+                endTime : endTime
+            },
+            url: "${path}/admin/customer_report/get_pic_chart_data",
+            success: function(data){
+                //alert(JSON.stringify(data.returnMsg));
+                showChart(data.returnMsg);
+                layer.close(index);
+            },
+            error: function(XmlHttpRequest, textStatus, errorThrown){
+                layer.close(index);
+            }
+        })
+    }
+
+    function showChart(data){
+        // 第二个参数可以指定前面引入的主题
+        var chart = echarts.init(document.getElementById('main'), 'macarons');
+        var option = {
+            title: {
+                text: data.name,
+                subtext: data.dateValue,
+                left: 'center'
+            },
+            tooltip : {
+                trigger: 'item',
+                formatter: "{a} <br/>{b} : {c} ({d}%)"
+            },
+            legend: {
+                //orient: 'vertical',
+                //top: 'middle',
+                //x: 'left',
+                //itemWidth: 20,             // 图例图形宽度
+                //itemHeight: 14,            // 图例图形高度
+                //padding: 50,
+                bottom: 40,
+                left: 'center',
+                data: data.nameList
+            },
+            series : [
+                {
+                    type: 'pie',
+                    radius : '40%',
+                    center: ['50%', '40%'],
+                    selectedMode: 'single',
+                    data:data.dataList,
+                    itemStyle: {
+                        emphasis: {
+                            shadowBlur: 10,
+                            shadowOffsetX: 0,
+                            shadowColor: 'rgba(0, 0, 0, 0.5)'
+                        }
+                    }
+                }
+            ]
+        };
+        // 使用刚指定的配置项和数据显示图表。
+        chart.setOption(option);
+    }
+</script>
+</body>
+</html>

+ 316 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/cm/report/customer_report.ftl

@@ -0,0 +1,316 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+    <meta http-equiv="Cache-Control" content="no-siteapp" />
+    <link rel="Bookmark" href="/favicon.ico" >
+    <link rel="Shortcut Icon" href="/favicon.ico" />
+<#include "/base/list_base.ftl">
+    <title>客诉统计</title>
+    <style>
+        *{padding: 0;margin: 0;}
+        .my-input{border: 1px solid rgba(0,0,0,.1);padding: 1px 5px;height: 32px;margin-right: 10px;}
+        .my-select{border: 1px solid rgba(0,0,0,.1);padding:6px 50px 6px 15px;height: 34px;margin: 0 10px; -webkit-appearance:none;appearance:none;background: url(${path}/common/images/pts/select-1.png) right center no-repeat;background-size:auto 100%;}
+        .my-btn-search{border: 1px solid #32a3d8;padding: 1px 25px;height: 32px;background-color: #32a3d8;color: #fff;}
+        .table-bg thead th{background-color: #e2f6ff;}
+        .update-parts>span{margin-right: 10px;padding: 3px 4px;background-color: #effaff;border: 1px solid #32a3d8;}
+        .txt2{
+            width:60px;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+        }
+    </style>
+</head>
+<body>
+<nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页
+    <span class="c-gray en">&gt;</span> 客诉管理
+    <span class="c-gray en">&gt;</span> 客诉统计
+    <a class="btn radius r" style="line-height:1.6em;margin-top:3px;background: #32a3d8;color: #fff;border:1px solid #32a3d8;" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<div class="page-container">
+    <div class="text-c">
+        <form method="post">
+
+            <input type="text" placeholder="请选择开始日期" id="startTime"  name="startTime" class="my-input Wdate" onclick="WdatePicker({skin:'whyGreen',maxDate:'%y-%M-%d'})"  readonly="readonly">
+            <input type="text" placeholder="请选择结束日期" id="endTime"  name="endTime" class="my-input Wdate" onclick="WdatePicker({skin:'whyGreen',maxDate:'%y-%M-%d',minDate:'#F{$dp.$D(\'startTime\',{d:0})}'})"  readonly="readonly">
+
+            <button type="button" class="btn" style="background: #32a3d8;color: #fff;-webkit-transform:translateY(-5%);height: 35px;" id="" name="" onclick="getStatistics()"><i class="Hui-iconfont">&#xe665;</i> 查询</button>
+        </form>
+    </div>
+
+    <div class="cl bg-1 bk-gray " style="margin-top: 20px;">
+        <span class="l" style="margin-left: 10px; height: 30px;line-height: 30px;font-weight: bold;">
+           合计:<span id="allNumber">0</span>
+        </span>
+    </div>
+    <div class="mt-20" id="createTable" style="margin-top: 0px;">
+    </div>
+
+</div>
+<tfoot>
+</tfoot>
+<script type="text/javascript">
+
+    /*是否开启问题数量为0的展示   true 显示,false:不显示*/
+    var isEnabledZeroShow = false;
+
+    $(function (){
+        showTime();
+
+        /*查询统计*/
+        getStatistics();
+    });
+
+    function showTime(){
+        var myDate = new Date();//获取系统当前时间
+        var endTime = myDate.getFullYear() + "-" + (parseInt(myDate.getMonth())+1) + "-" + myDate.getDate();
+        $("#endTime").val(endTime);
+
+        var startTime = GetDateStr(-7);
+        $("#startTime").val(startTime);
+    }
+
+    function GetDateStr(AddDayCount) {
+        var dd = new Date();
+        dd.setDate(dd.getDate()+AddDayCount);//获取AddDayCount天后的日期
+        var y = dd.getFullYear();
+        var m = dd.getMonth()+1;//获取当前月份的日期
+        var d = dd.getDate();
+        return y+"-"+m+"-"+d;
+     }
+
+    /**
+     * 查询统计
+     */
+    function getStatistics() {
+        var startTime = $("#startTime").val();
+        var endTime = $("#endTime").val();
+        var index = layer.load(1, {
+            shade: [0.5,'#fff'] //0.1透明度的白色背景
+        });
+        $.ajax({
+            cache: true,
+            type: "POST",
+            data: {
+                startTime :startTime,
+                endTime : endTime
+            },
+            url: "${path}/admin/customer_report/question_statistics",
+            success: function(data){
+                var typeList = data.returnMsg.complaintTypeInfoList;
+                var num = data.returnMsg.num;
+
+                var arrayTile = new Array(); // 表格标题数组
+                arrayTile.push("日期");
+                arrayTile.push("类型");
+                arrayTile.push("数量");
+                arrayTile.push("类型");
+                arrayTile.push("数量");
+                arrayTile.push("客诉问题");
+                arrayTile.push("数量");
+                arrayTile.push("百分比");
+
+                var tbody_array = new Array();
+                table_fmt.creat_table(arrayTile,typeList,null,num);
+
+                $("#allNumber").html(data.returnMsg.num);
+
+                layer.close(index);
+            },
+            error: function(XmlHttpRequest, textStatus, errorThrown){
+                layer.close(index);
+            }
+        })
+    }
+
+    /**
+     * 展示饼图
+     * @param id
+     * @param typeName
+     */
+    function showPieChart(id,typeName){
+        var startTime = $("#startTime").val();
+        var endTime = $("#endTime").val();
+        layer_show("客诉问题分布图","${path}/admin/customer_report/show_pie_chart?startTime="+startTime+"&endTime=" +endTime+"&id="+ id +"&typeName="+typeName ,"900","500");
+    }
+</script>
+
+<script>
+    var table_fmt = {
+        creat_table : function (titleTable,allTableArray,lelNum,allNum){
+            table_fmt.hebingFunction();
+            $('#createTable').html('');
+            var table = $('<table id="process" class="table table-border table-bg table-bordered" ></table>');
+            table.appendTo($('#createTable'));
+            var thead = $('<thead></thead>');
+            thead.appendTo(table);
+            var trHead = $('<tr class="text-c"></tr>');
+            trHead.appendTo(thead);
+            // 创建表头
+            var str = '';
+            $.each(titleTable, function(index, item) {
+                str += '<th width="100">' + item + '</th>';
+            })
+            //str += '<th  width="200">价格</th><th width="100">操作</th>';
+            trHead.append(str);
+            var tbody = $('<tbody></tbody>');
+            tbody.appendTo(table);
+
+            var table_array = table_fmt.creat_tbody(allTableArray,allNum);
+
+            var style_array = [
+                "width: 10%;",
+                "width: 12%;",
+                "display: none;",
+                "width: 8%;",
+                "width: 12%;",
+                "display: none;",
+                "width: 8%;",
+                "width: 32%;text-align: left !important;",
+                "display: none;",
+                "width: 8%;",
+                "width: 10%;"
+            ];
+
+            if (table_array.length > 0) {
+                //创建行
+                $.each(table_array, function(index, item) {
+                    var tr = $('<tr></tr>');
+                    tr.appendTo(tbody);
+                    var str = '';
+                    for(var i=0;i<table_array[index].length;i++){
+                        switch (i){
+                            case 1:
+                                str += '<td class="text-c" style="'+ style_array[i] +'"><a href="javascript:void(0);" style="color: #06c;"  onclick="showPieChart(' + table_array[index][i+1] + ',\'type\')">' + table_array[index][i] + '<a></td>';
+                                break;
+                            case 4:
+                                str += '<td class="text-c" style="'+ style_array[i] +'"><a href="javascript:void(0);" style="color: #06c;" onclick="showPieChart(' + table_array[index][i+1] + ',\'small\')">' + table_array[index][i] + '<a></td>';
+                                break;
+                            default:
+                                str += '<td class="text-c" style="'+ style_array[i] +'">' + table_array[index][i] + '</td>';
+                                break;
+                        }
+                    }
+                    tr.append(str);
+                });
+            }
+
+            //结束创建Table表
+            //arrayColumn.pop(); //删除数组中最后一项
+
+            var arrayColumn = new Array(); // 指定列,用来合并哪些列
+            arrayColumn.push(0);
+            arrayColumn.push(1);
+            arrayColumn.push(2);
+            arrayColumn.push(3);
+            arrayColumn.push(4);
+            arrayColumn.push(5);
+            arrayColumn.push(6);
+
+            //合并单元格
+            $(table).mergeCell({
+                // 目前只有cols这么一个配置项, 用数组表示列的索引,从0开始
+                cols: arrayColumn
+            });
+        },
+        creat_tbody : function (allTableArray,allNum){
+
+            var  table_array = new Array();
+            for(var i=0; i<allTableArray.length; i++){
+                if(!isEnabledZeroShow && allTableArray[i].complaintNum != 0){
+                    for(var j=0; j<allTableArray[i].smallClassInfoList.length; j++){
+                        var small = allTableArray[i].smallClassInfoList[j];
+                        if(!isEnabledZeroShow && small.smallClassNum != 0){
+                            for(var k=0; k<small.questionInfoList.length; k++){
+                                var question = small.questionInfoList[k];
+                                if(!isEnabledZeroShow &&  question.questionNum != 0){
+                                    var tb_array = new Array();
+                                    tb_array.push("2017-2018");
+                                    tb_array.push(allTableArray[i].complaintClassName);
+                                    tb_array.push(allTableArray[i].complaintId);
+                                    tb_array.push(allTableArray[i].complaintNum)
+                                    tb_array.push(small.smallClassName);
+                                    tb_array.push(small.smallClassId);
+                                    tb_array.push(small.smallClassNum);
+                                    tb_array.push(question.questionName);
+                                    tb_array.push(question.questionId);
+                                    tb_array.push(question.questionNum);
+                                    var n = (Math.round((question.questionNum/allNum) * 10000)/100).toFixed(2) + '%';
+                                    tb_array.push(n);
+                                    table_array.push(tb_array);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            return table_array;
+        },
+        hebingFunction: function() {
+            $.fn.mergeCell = function(options) {
+                return this.each(function() {
+                    var cols = options.cols;
+                    for (var i = cols.length - 1; cols[i] != undefined; i--) {
+                        mergeCell($(this), cols[i]);
+                    }
+                    dispose($(this));
+                })
+            };
+
+            function mergeCell($table, colIndex) {
+                $table.data('col-content', ''); // 存放单元格内容
+                $table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
+                $table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
+                $table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
+                // 进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
+                $('tbody tr', $table).each(function(index) {
+                    // td:eq中的colIndex即列索引
+                    var $td = $('td:eq(' + colIndex + ')', this);
+                    // 获取单元格的当前内容
+                    var currentContent = $td.html();
+                    // 第一次时走次分支
+                    if ($table.data('col-content') == '') {
+                        $table.data('col-content', currentContent);
+                        $table.data('col-td', $td);
+                    } else {
+                        // 上一行与当前行内容相同
+                        if ($table.data('col-content') == currentContent) {
+                            // 上一行与当前行内容相同则col-rowspan累加, 保存新值
+                            var rowspan = $table.data('col-rowspan') + 1;
+                            $table.data('col-rowspan', rowspan);
+                            // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
+                            $td.hide();
+                            // 最后一行的情况比较特殊一点
+                            // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
+                            // 最后一行不会向下判断是否有不同的内容
+                            if (++index == $table.data('trNum'))
+                                $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
+                        }
+                        // 上一行与当前行内容不同
+                        else {
+                            // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
+                            if ($table.data('col-rowspan') != 1) {
+                                $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
+                            }
+                            // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
+                            $table.data('col-td', $td);
+                            $table.data('col-content', $td.html());
+                            $table.data('col-rowspan', 1);
+                        }
+                    }
+                })
+            }
+            // 同样是个private函数 清理内存之用
+            function dispose($table) {
+                $table.removeData();
+            }
+        }
+    }
+</script>
+
+</body>
+</html>

+ 1 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/order/excel_to_order.ftl

@@ -99,6 +99,7 @@
                             <option value="26">北京悦祺</option>
                             <option value="27">上海淘宝</option>
                             <option value="28">蓝极风</option>
+                            <option value="29">小莉团购</option>
                         </select>
                     </label>
                 </td>

文件差异内容过多而无法显示
+ 1 - 0
watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.common.min.js


文件差异内容过多而无法显示
+ 74771 - 0
watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.js


文件差异内容过多而无法显示
+ 1 - 0
watero-rst-web/src/main/webapp/common/lib/echarts/3.8/echarts.min.js


+ 198 - 0
watero-rst-web/src/main/webapp/common/lib/echarts/3.8/macarons.js

@@ -0,0 +1,198 @@
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['exports', 'echarts'], factory);
+    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
+        // CommonJS
+        factory(exports, require('echarts'));
+    } else {
+        // Browser globals
+        factory({}, root.echarts);
+    }
+}(this, function (exports, echarts) {
+    var log = function (msg) {
+        if (typeof console !== 'undefined') {
+            console && console.error && console.error(msg);
+        }
+    };
+    if (!echarts) {
+        log('ECharts is not Loaded');
+        return;
+    }
+
+    var colorPalette = [
+        '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
+        '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
+        '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
+        '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
+    ];
+
+
+    var theme = {
+        color: colorPalette,
+
+        title: {
+            textStyle: {
+                fontWeight: 'normal',
+                color: '#008acd'
+            }
+        },
+
+        visualMap: {
+            itemWidth: 15,
+            color: ['#5ab1ef','#e0ffff']
+        },
+
+        toolbox: {
+            iconStyle: {
+                normal: {
+                    borderColor: colorPalette[0]
+                }
+            }
+        },
+
+        tooltip: {
+            backgroundColor: 'rgba(50,50,50,0.5)',
+            axisPointer : {
+                type : 'line',
+                lineStyle : {
+                    color: '#008acd'
+                },
+                crossStyle: {
+                    color: '#008acd'
+                },
+                shadowStyle : {
+                    color: 'rgba(200,200,200,0.2)'
+                }
+            }
+        },
+
+        dataZoom: {
+            dataBackgroundColor: '#efefff',
+            fillerColor: 'rgba(182,162,222,0.2)',
+            handleColor: '#008acd'
+        },
+
+        grid: {
+            borderColor: '#eee'
+        },
+
+        categoryAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        valueAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitArea : {
+                show : true,
+                areaStyle : {
+                    color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        timeline : {
+            lineStyle : {
+                color : '#008acd'
+            },
+            controlStyle : {
+                normal : { color : '#008acd'},
+                emphasis : { color : '#008acd'}
+            },
+            symbol : 'emptyCircle',
+            symbolSize : 3
+        },
+
+        line: {
+            smooth : true,
+            symbol: 'emptyCircle',
+            symbolSize: 3
+        },
+
+        candlestick: {
+            itemStyle: {
+                normal: {
+                    color: '#d87a80',
+                    color0: '#2ec7c9',
+                    lineStyle: {
+                        color: '#d87a80',
+                        color0: '#2ec7c9'
+                    }
+                }
+            }
+        },
+
+        scatter: {
+            symbol: 'circle',
+            symbolSize: 4
+        },
+
+        map: {
+            label: {
+                normal: {
+                    textStyle: {
+                        color: '#d87a80'
+                    }
+                }
+            },
+            itemStyle: {
+                normal: {
+                    borderColor: '#eee',
+                    areaColor: '#ddd'
+                },
+                emphasis: {
+                    areaColor: '#fe994e'
+                }
+            }
+        },
+
+        graph: {
+            color: colorPalette
+        },
+
+        gauge : {
+            axisLine: {
+                lineStyle: {
+                    color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
+                    width: 10
+                }
+            },
+            axisTick: {
+                splitNumber: 10,
+                length :15,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            splitLine: {
+                length :22,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            pointer : {
+                width : 5
+            }
+        }
+    };
+
+    echarts.registerTheme('macarons', theme);
+}));

+ 484 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/css/select2.css

@@ -0,0 +1,484 @@
+.select2-container {
+  box-sizing: border-box;
+  display: inline-block;
+  margin: 0;
+  position: relative;
+  vertical-align: middle; }
+  .select2-container .select2-selection--single {
+    box-sizing: border-box;
+    cursor: pointer;
+    display: block;
+    height: 28px;
+    user-select: none;
+    -webkit-user-select: none; }
+    .select2-container .select2-selection--single .select2-selection__rendered {
+      display: block;
+      padding-left: 8px;
+      padding-right: 20px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap; }
+    .select2-container .select2-selection--single .select2-selection__clear {
+      position: relative; }
+  .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
+    padding-right: 8px;
+    padding-left: 20px; }
+  .select2-container .select2-selection--multiple {
+    box-sizing: border-box;
+    cursor: pointer;
+    display: block;
+    min-height: 32px;
+    user-select: none;
+    -webkit-user-select: none; }
+    .select2-container .select2-selection--multiple .select2-selection__rendered {
+      display: inline-block;
+      overflow: hidden;
+      padding-left: 8px;
+      text-overflow: ellipsis;
+      white-space: nowrap; }
+  .select2-container .select2-search--inline {
+    float: left; }
+    .select2-container .select2-search--inline .select2-search__field {
+      box-sizing: border-box;
+      border: none;
+      font-size: 100%;
+      margin-top: 5px;
+      padding: 0; }
+      .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
+        -webkit-appearance: none; }
+
+.select2-dropdown {
+  background-color: white;
+  border: 1px solid #aaa;
+  border-radius: 4px;
+  box-sizing: border-box;
+  display: block;
+  position: absolute;
+  left: -100000px;
+  width: 100%;
+  z-index: 1051; }
+
+.select2-results {
+  display: block; }
+
+.select2-results__options {
+  list-style: none;
+  margin: 0;
+  padding: 0; }
+
+.select2-results__option {
+  padding: 6px;
+  user-select: none;
+  -webkit-user-select: none; }
+  .select2-results__option[aria-selected] {
+    cursor: pointer; }
+
+.select2-container--open .select2-dropdown {
+  left: 0; }
+
+.select2-container--open .select2-dropdown--above {
+  border-bottom: none;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.select2-container--open .select2-dropdown--below {
+  border-top: none;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0; }
+
+.select2-search--dropdown {
+  display: block;
+  padding: 4px; }
+  .select2-search--dropdown .select2-search__field {
+    padding: 4px;
+    width: 100%;
+    box-sizing: border-box; }
+    .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
+      -webkit-appearance: none; }
+  .select2-search--dropdown.select2-search--hide {
+    display: none; }
+
+.select2-close-mask {
+  border: 0;
+  margin: 0;
+  padding: 0;
+  display: block;
+  position: fixed;
+  left: 0;
+  top: 0;
+  min-height: 100%;
+  min-width: 100%;
+  height: auto;
+  width: auto;
+  opacity: 0;
+  z-index: 99;
+  background-color: #fff;
+  filter: alpha(opacity=0); }
+
+.select2-hidden-accessible {
+  border: 0 !important;
+  clip: rect(0 0 0 0) !important;
+  -webkit-clip-path: inset(50%) !important;
+  clip-path: inset(50%) !important;
+  height: 1px !important;
+  overflow: hidden !important;
+  padding: 0 !important;
+  position: absolute !important;
+  width: 1px !important;
+  white-space: nowrap !important; }
+
+.select2-container--default .select2-selection--single {
+  background-color: #fff;
+  border: 1px solid #aaa;
+  border-radius: 4px; }
+  .select2-container--default .select2-selection--single .select2-selection__rendered {
+    color: #444;
+    line-height: 28px; }
+  .select2-container--default .select2-selection--single .select2-selection__clear {
+    cursor: pointer;
+    float: right;
+    font-weight: bold; }
+  .select2-container--default .select2-selection--single .select2-selection__placeholder {
+    color: #999; }
+  .select2-container--default .select2-selection--single .select2-selection__arrow {
+    height: 26px;
+    position: absolute;
+    top: 1px;
+    right: 1px;
+    width: 20px; }
+    .select2-container--default .select2-selection--single .select2-selection__arrow b {
+      border-color: #888 transparent transparent transparent;
+      border-style: solid;
+      border-width: 5px 4px 0 4px;
+      height: 0;
+      left: 50%;
+      margin-left: -4px;
+      margin-top: -2px;
+      position: absolute;
+      top: 50%;
+      width: 0; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
+  float: left; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+  left: 1px;
+  right: auto; }
+
+.select2-container--default.select2-container--disabled .select2-selection--single {
+  background-color: #eee;
+  cursor: default; }
+  .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
+    display: none; }
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+  border-color: transparent transparent #888 transparent;
+  border-width: 0 4px 5px 4px; }
+
+.select2-container--default .select2-selection--multiple {
+  background-color: white;
+  border: 1px solid #aaa;
+  border-radius: 4px;
+  cursor: text; }
+  .select2-container--default .select2-selection--multiple .select2-selection__rendered {
+    box-sizing: border-box;
+    list-style: none;
+    margin: 0;
+    padding: 0 5px;
+    width: 100%; }
+    .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
+      list-style: none; }
+  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
+    color: #999;
+    margin-top: 5px;
+    float: left; }
+  .select2-container--default .select2-selection--multiple .select2-selection__clear {
+    cursor: pointer;
+    float: right;
+    font-weight: bold;
+    margin-top: 5px;
+    margin-right: 10px; }
+  .select2-container--default .select2-selection--multiple .select2-selection__choice {
+    background-color: #e4e4e4;
+    border: 1px solid #aaa;
+    border-radius: 4px;
+    cursor: default;
+    float: left;
+    margin-right: 5px;
+    margin-top: 5px;
+    padding: 0 5px; }
+  .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
+    color: #999;
+    cursor: pointer;
+    display: inline-block;
+    font-weight: bold;
+    margin-right: 2px; }
+    .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
+      color: #333; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
+  float: right; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+  margin-left: 5px;
+  margin-right: auto; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+  margin-left: 2px;
+  margin-right: auto; }
+
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+  border: solid black 1px;
+  outline: 0; }
+
+.select2-container--default.select2-container--disabled .select2-selection--multiple {
+  background-color: #eee;
+  cursor: default; }
+
+.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
+  display: none; }
+
+.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0; }
+
+.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+  border: 1px solid #aaa; }
+
+.select2-container--default .select2-search--inline .select2-search__field {
+  background: transparent;
+  border: none;
+  outline: 0;
+  box-shadow: none;
+  -webkit-appearance: textfield; }
+
+.select2-container--default .select2-results > .select2-results__options {
+  max-height: 200px;
+  overflow-y: auto; }
+
+.select2-container--default .select2-results__option[role=group] {
+  padding: 0; }
+
+.select2-container--default .select2-results__option[aria-disabled=true] {
+  color: #999; }
+
+.select2-container--default .select2-results__option[aria-selected=true] {
+  background-color: #ddd; }
+
+.select2-container--default .select2-results__option .select2-results__option {
+  padding-left: 1em; }
+  .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
+    padding-left: 0; }
+  .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
+    margin-left: -1em;
+    padding-left: 2em; }
+    .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+      margin-left: -2em;
+      padding-left: 3em; }
+      .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+        margin-left: -3em;
+        padding-left: 4em; }
+        .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+          margin-left: -4em;
+          padding-left: 5em; }
+          .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+            margin-left: -5em;
+            padding-left: 6em; }
+
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+  background-color: #5897fb;
+  color: white; }
+
+.select2-container--default .select2-results__group {
+  cursor: default;
+  display: block;
+  padding: 6px; }
+
+.select2-container--classic .select2-selection--single {
+  background-color: #f7f7f7;
+  border: 1px solid #aaa;
+  border-radius: 4px;
+  outline: 0;
+  background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
+  background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+  .select2-container--classic .select2-selection--single:focus {
+    border: 1px solid #5897fb; }
+  .select2-container--classic .select2-selection--single .select2-selection__rendered {
+    color: #444;
+    line-height: 28px; }
+  .select2-container--classic .select2-selection--single .select2-selection__clear {
+    cursor: pointer;
+    float: right;
+    font-weight: bold;
+    margin-right: 10px; }
+  .select2-container--classic .select2-selection--single .select2-selection__placeholder {
+    color: #999; }
+  .select2-container--classic .select2-selection--single .select2-selection__arrow {
+    background-color: #ddd;
+    border: none;
+    border-left: 1px solid #aaa;
+    border-top-right-radius: 4px;
+    border-bottom-right-radius: 4px;
+    height: 26px;
+    position: absolute;
+    top: 1px;
+    right: 1px;
+    width: 20px;
+    background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+    background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+    background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
+    .select2-container--classic .select2-selection--single .select2-selection__arrow b {
+      border-color: #888 transparent transparent transparent;
+      border-style: solid;
+      border-width: 5px 4px 0 4px;
+      height: 0;
+      left: 50%;
+      margin-left: -4px;
+      margin-top: -2px;
+      position: absolute;
+      top: 50%;
+      width: 0; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
+  float: left; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+  border: none;
+  border-right: 1px solid #aaa;
+  border-radius: 0;
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  left: 1px;
+  right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--single {
+  border: 1px solid #5897fb; }
+  .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
+    background: transparent;
+    border: none; }
+    .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
+      border-color: transparent transparent #888 transparent;
+      border-width: 0 4px 5px 4px; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
+  border-top: none;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
+  background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
+  background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
+  border-bottom: none;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
+  background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
+  background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
+
+.select2-container--classic .select2-selection--multiple {
+  background-color: white;
+  border: 1px solid #aaa;
+  border-radius: 4px;
+  cursor: text;
+  outline: 0; }
+  .select2-container--classic .select2-selection--multiple:focus {
+    border: 1px solid #5897fb; }
+  .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
+    list-style: none;
+    margin: 0;
+    padding: 0 5px; }
+  .select2-container--classic .select2-selection--multiple .select2-selection__clear {
+    display: none; }
+  .select2-container--classic .select2-selection--multiple .select2-selection__choice {
+    background-color: #e4e4e4;
+    border: 1px solid #aaa;
+    border-radius: 4px;
+    cursor: default;
+    float: left;
+    margin-right: 5px;
+    margin-top: 5px;
+    padding: 0 5px; }
+  .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
+    color: #888;
+    cursor: pointer;
+    display: inline-block;
+    font-weight: bold;
+    margin-right: 2px; }
+    .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
+      color: #555; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+  float: right;
+  margin-left: 5px;
+  margin-right: auto; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+  margin-left: 2px;
+  margin-right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--multiple {
+  border: 1px solid #5897fb; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
+  border-top: none;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0; }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
+  border-bottom: none;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.select2-container--classic .select2-search--dropdown .select2-search__field {
+  border: 1px solid #aaa;
+  outline: 0; }
+
+.select2-container--classic .select2-search--inline .select2-search__field {
+  outline: 0;
+  box-shadow: none; }
+
+.select2-container--classic .select2-dropdown {
+  background-color: white;
+  border: 1px solid transparent; }
+
+.select2-container--classic .select2-dropdown--above {
+  border-bottom: none; }
+
+.select2-container--classic .select2-dropdown--below {
+  border-top: none; }
+
+.select2-container--classic .select2-results > .select2-results__options {
+  max-height: 200px;
+  overflow-y: auto; }
+
+.select2-container--classic .select2-results__option[role=group] {
+  padding: 0; }
+
+.select2-container--classic .select2-results__option[aria-disabled=true] {
+  color: grey; }
+
+.select2-container--classic .select2-results__option--highlighted[aria-selected] {
+  background-color: #3875d7;
+  color: white; }
+
+.select2-container--classic .select2-results__group {
+  cursor: default;
+  display: block;
+  padding: 6px; }
+
+.select2-container--classic.select2-container--open .select2-dropdown {
+  border-color: #5897fb; }

文件差异内容过多而无法显示
+ 1 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/css/select2.min.css


文件差异内容过多而无法显示
+ 3 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/i18n/en.js


文件差异内容过多而无法显示
+ 3 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/i18n/zh-CN.js


文件差异内容过多而无法显示
+ 6559 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.full.js


文件差异内容过多而无法显示
+ 1 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.full.min.js


文件差异内容过多而无法显示
+ 5847 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.js


文件差异内容过多而无法显示
+ 1 - 0
watero-rst-web/src/main/webapp/common/lib/select2/dist/js/select2.min.js