Pārlūkot izejas kodu

机构列表迁移

zhijiezhao 10 mēneši atpakaļ
vecāks
revīzija
b8eed8ebdb

+ 16 - 0
src/main/java/com/caimei365/manager/controller/caimei/user/UserApi.java

@@ -5,6 +5,7 @@ import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
 import com.caimei365.manager.entity.caimei.cmUser.CmClub;
 import com.caimei365.manager.entity.caimei.cmUser.CmClubLabel;
+import com.caimei365.manager.entity.caimei.cmUser.CmPortrait;
 import com.caimei365.manager.service.caimei.user.CmUserService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户管理接口
@@ -41,4 +43,18 @@ public class UserApi {
         return userService.getClubLabels(dynamicStatus);
     }
 
+    @GetMapping("/club/portrait")
+    public ResponseJson<CmPortrait> getClubPortrait(Integer clubId) {
+        return userService.getClubPortrait(clubId);
+    }
+
+    /**
+     * 机构画像图表数据
+     * @param port
+     * @return
+     */
+    @GetMapping("/club/selPortraitData")
+    public ResponseJson<Map<String, Object>> selPortraitData(CmPortrait port) {
+        return userService.selPortraitData(port);
+    }
 }

+ 15 - 3
src/main/java/com/caimei365/manager/dao/user/UserMapper.java

@@ -2,9 +2,9 @@ package com.caimei365.manager.dao.user;
 
 import java.util.List;
 
-import com.caimei365.manager.entity.caimei.cmUser.CmClub;
-import com.caimei365.manager.entity.caimei.cmUser.CmClubLabel;
-import com.caimei365.manager.entity.caimei.cmUser.User;
+import com.caimei365.manager.entity.caimei.CmBehaviorRecord;
+import com.caimei365.manager.entity.caimei.CmShopOrder;
+import com.caimei365.manager.entity.caimei.cmUser.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -92,4 +92,16 @@ public interface UserMapper {
     List<CmClub> findClubList(CmClub club);
 
     List<CmClubLabel> findLabels(Integer dynamicStatus);
+
+    CmPortrait selClubData(Integer clubId);
+
+    CmClubRemarks getClubRemarksInfo(Integer clubId);
+
+    List<CmShopOrder> selOrderList(CmPortrait cmPortrait);
+
+    List<CmBehaviorRecord> selBehaviorList(CmPortrait cmPortrait);
+
+    List<CmClubRemarks> selRemarksList(CmPortrait cmPortrait);
+
+    List<CmBehaviorRecord> selBehaviorPageTypeList(CmPortrait cmPortrait);
 }

+ 14 - 0
src/main/java/com/caimei365/manager/entity/caimei/CmShopOrder.java

@@ -13,6 +13,20 @@ import java.io.Serializable;
 @Data
 public class CmShopOrder implements Serializable {
     private static final long serialVersionUID = 1L;
+
+    private Integer status;
+
+    private String refundType;
+
+    private String rebateFlag;
+
+    private String secondHandOrderFlag;
+
+    private Double orderTotalAmount;
+
+    private Integer orderTotal;
+
+    private Double payTotalFee;
     /**
      * 子订单ID
      */

+ 20 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/ArrDate.java

@@ -0,0 +1,20 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+
+@Data
+public class ArrDate {
+
+    private ArrayList<String> name;
+    private ArrayList<Integer> value;
+    private ArrayList<Integer> value1;
+    private ArrayList<OrderPortrait> orderList;
+    private ArrayList<OrderPortrait> clubInfo;
+    private ArrayList<OrderPortrait> internalPortrait;
+    private Integer orderTotalNum;
+    private Integer total;
+    private String startTime;
+    private String endTime;
+}

+ 8 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmClubRemarks.java

@@ -220,4 +220,12 @@ public class CmClubRemarks {
      * 静态标签
      */
     private String stateKeyword;
+    /**
+     * 首次咨询时间
+     */
+    private String firstTime;
+    /**
+     * 最近咨询时间
+     */
+    private String recentlyTime;
 }

+ 135 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPortrait.java

@@ -0,0 +1,135 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
+@Data
+public class CmPortrait {
+
+    private Integer userId;
+    // 机构id
+    private Integer clubId;
+
+    // 日期类别 0日 1月 2半年 3全年
+    private Integer dateType;
+    // 开始时间
+    private String startTime;
+    // 结束时间
+    private String endTime;
+    // 统计类别 0订单 1搜索关键词 2咨询记录 3访问记录 4初始状态
+    private Integer type;
+    // 时间
+    private String accessDate;
+
+    // 订单总量
+    private Integer orderTotal;
+    // 当前范围订单总金额
+    private double orderScopeTotalFee;
+    // 当前订单范围总量
+    private Integer orderScopeNum;
+    // 订单总金额
+    private BigDecimal orderTotalAmount;
+    // 订单类型值value  订单类型name
+    private ArrayList<OrderPortrait> orderPortrait;
+    // 搜索关键词总数
+    private Integer totalkeywords;
+    // 当前关键词范围总量
+    private Integer keyWordsScopeNum;
+    // 搜索关键词数量
+    private ArrayList<Integer> behaviorValue;
+    // 搜索关键词
+    private ArrayList<String> behaviorType;
+    // 咨询记录总数
+    private Integer remarksTotal;
+    // 当前咨询记录范围总量
+    private Integer remarksScopeNum;
+    // 访问记录总量
+    private Integer visitTotal;
+    // 当前访问记录总量
+    private Integer visitNum;
+    // 咨询记录数
+    private ArrayList<Integer> remarksValue;
+    // 咨询记录关键词
+    private ArrayList<String> remarksType;
+    // 访问记录数
+    private ArrayList<Integer> pageTypeValue;
+    // 访问词
+    private ArrayList<String> pageType;
+
+
+
+    private String registerStartTime;       //注册开始时间
+    private String registerEndTime;         //注册结束时间
+    private String searchStartTime;         //最近下单开始时间
+    private String searchEndTime;           //最近下单结束时间
+    private String customerValue;           //机构类型
+    private String searchUserIdentity;      //机构级别
+    private String searchStatus;            //状态
+    private String customStartTime;         //自定义统计开始时间
+    private String customEndTime;           //自定义统计结束时间
+    private String monthStartTime;         //近一个月开始时间
+    private String monthEndTime;           //近一个月结束时间
+    private String yearStartTime;         //近一个年开始时间
+    private String yearEndTime;           //近一个年结束时间
+
+    // 排序
+    private Integer payTotalMonthType;  //近一个月购买额类型 0正序、1倒叙
+    private Integer orderCountMonthType;    //近一个月订单数类型 0正序、1倒叙
+    private Integer payTotalYearType;   //近一年购买额类型 0正序、1倒叙
+    private Integer orderCountYearType; //近一年订单数类型 0正序、1倒叙
+    private Integer payTotalType;   //总购买额类型 0正序、1倒叙
+
+    private String province;
+    private String city;
+    private String town;
+
+    private Integer sex;    //性别
+    private String age;    // 年龄
+    private String name;    // 机构名称
+    private String linkMan; //联系人
+    private String contractMobile;  //联系手机
+    private String linkManIdentity; //联系人身份:1老板,2采购,3运营,4其他
+    private String spName;      //协销人员
+    private String address;         //详细地址
+    private String businessLicenseImage;    //营业执照
+    private String userIdentity;    //用户身份
+    private String sname;   //机构简称
+    private String contractEmail;   //联系邮箱
+    private String contractPhone;   //联系电话
+    private String fax;     //传真
+    private String headpic;     //门头照
+    private String socialCreditCode;    //统一社会信用代码 --- 营业执照编号
+    private String info;    //公司简介
+    private String linkManStatus;   //联系人身份
+    private String clubStatus;  // 机构状态
+    private String clubRank;  // 机构级别
+    private String firstClubType;  // 机构一级分类
+    private String classify;  // 机构二级分类
+    private String clubType;  // 机构类型
+    private Integer number;  // 资料完整度数值
+    private String clubDataIntegrity;  // 资料完整度
+    private String addTime;  // 注册时间
+    private String svipUserFlag;  // vip类别
+    private String payTotalMonth;  // 近一个月购买额
+    private String orderCountMonth;  // 近一个月订单数
+    private String payTotalYear;  // 近一个年购买额
+    private String orderCountYear;  // 近一个年订单数
+    private String payTotal;  // 总购买额
+    private String pageLabel;   //最常搜索词
+    private String lastOrderTime;  // 最近下单时间
+    private String activeState;     // 活跃状态
+    private String customerValues;   // 客户价值
+    private String registerTime;    // 注册时间
+    private Integer customerSource;    // 客户来源 0 公众号 1 小红书 2 微博 3 搜狐 4 其他
+    private Integer groupAddition;    // 入群状态 0 以加群 1 未加群
+    private Integer wxReach;        // 微信触达 0 触达 1 未触达
+    private Integer mobileReach;    // 电话触达 0 触达 1 未触达
+    private String fillTime;    // 填写时间
+
+    private String firstTime;   //首次咨询时间
+
+    private String recentlyTime;    //最近咨询时间
+}
+

+ 9 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/OrderPortrait.java

@@ -0,0 +1,9 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+@Data
+public class OrderPortrait {
+    private Integer value;
+    private String name;
+}

+ 6 - 0
src/main/java/com/caimei365/manager/service/caimei/user/CmUserService.java

@@ -4,13 +4,19 @@ import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
 import com.caimei365.manager.entity.caimei.cmUser.CmClub;
 import com.caimei365.manager.entity.caimei.cmUser.CmClubLabel;
+import com.caimei365.manager.entity.caimei.cmUser.CmPortrait;
 import com.caimei365.manager.entity.caimei.cmUser.User;
 
 import java.util.List;
+import java.util.Map;
 
 public interface CmUserService {
 
     ResponseJson<PaginationVo<CmClub>> getClubList(CmClub club, int pageNum, int pageSize);
 
     ResponseJson<List<CmClubLabel>> getClubLabels(Integer dynamicStatus);
+
+    ResponseJson<CmPortrait> getClubPortrait(Integer clubId);
+
+    ResponseJson<Map<String, Object>> selPortraitData(CmPortrait port);
 }

+ 389 - 5
src/main/java/com/caimei365/manager/service/caimei/user/impl/CmUserServiceImpl.java

@@ -3,14 +3,21 @@ package com.caimei365.manager.service.caimei.user.impl;
 import com.caimei365.manager.dao.user.UserMapper;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
-import com.caimei365.manager.entity.caimei.cmUser.CmClub;
-import com.caimei365.manager.entity.caimei.cmUser.CmClubLabel;
+import com.caimei365.manager.entity.caimei.CmBehaviorRecord;
+import com.caimei365.manager.entity.caimei.CmShopOrder;
+import com.caimei365.manager.entity.caimei.cmUser.*;
 import com.caimei365.manager.service.caimei.user.CmUserService;
 import com.github.pagehelper.PageHelper;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Service
 public class CmUserServiceImpl implements CmUserService {
@@ -20,7 +27,7 @@ public class CmUserServiceImpl implements CmUserService {
 
     @Override
     public ResponseJson<PaginationVo<CmClub>> getClubList(CmClub club, int pageNum, int pageSize) {
-        PageHelper.startPage(pageNum,pageSize);
+        PageHelper.startPage(pageNum, pageSize);
         List<CmClub> clubs = userMapper.findClubList(club);
         PaginationVo<CmClub> pageList = new PaginationVo<>(clubs);
         return ResponseJson.success(pageList);
@@ -29,8 +36,385 @@ public class CmUserServiceImpl implements CmUserService {
     @Override
     public ResponseJson<List<CmClubLabel>> getClubLabels(Integer dynamicStatus) {
         List<CmClubLabel> labels = userMapper.findLabels(dynamicStatus);
-        return null;
+        return ResponseJson.success(labels);
     }
 
+    @Override
+    public ResponseJson<CmPortrait> getClubPortrait(Integer clubId) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        CmPortrait clubStatistics = userMapper.selClubData(clubId);
+        if (clubStatistics != null) {
+            String type = "";
+            if (StringUtils.isNotBlank(clubStatistics.getFirstClubType())) {
+                type += clubStatistics.getFirstClubType();
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getClassify())) {
+                type += "-" + clubStatistics.getClassify();
+            }
+            clubStatistics.setClubType(type);
+            setClubNum(clubStatistics);
+            // 设置机构信息
+            CmClubRemarks clubRemarksInfo = userMapper.getClubRemarksInfo(clubId);
+            if (null != clubRemarksInfo) {
+                clubStatistics.setCustomerSource(clubRemarksInfo.getCustomerSource() != null ? clubRemarksInfo.getCustomerSource() : 4);
+                clubStatistics.setGroupAddition(clubRemarksInfo.getGroupAddition() != null ? clubRemarksInfo.getGroupAddition() : 1);
+                clubStatistics.setMobileReach(1);
+                if (null != clubRemarksInfo.getCommunicationMethods() && clubRemarksInfo.getCommunicationMethods().contains("1")) {
+                    clubStatistics.setMobileReach(0);
+                }
+                clubStatistics.setWxReach(1);
+                if (null != clubRemarksInfo.getCommunicationMethods() && clubRemarksInfo.getCommunicationMethods().contains("2")) {
+                    clubStatistics.setWxReach(0);
+                }
+                clubStatistics.setSex(clubRemarksInfo.getCustomerGender() != null ? clubRemarksInfo.getGroupAddition() : null);
+                clubStatistics.setAge(StringUtils.isNotBlank(clubRemarksInfo.getCustomerAge()) ? clubRemarksInfo.getCustomerAge() : null);
+                clubStatistics.setFillTime(dateFormat.format(clubRemarksInfo.getAddTime()));
+                try {
+                    clubStatistics.setFirstTime(StringUtils.isNotBlank(clubRemarksInfo.getFirstTime()) ? dateFormat.format(dateFormat.parse(clubRemarksInfo.getFirstTime())) : null);
+                    clubStatistics.setRecentlyTime(StringUtils.isNotBlank(clubRemarksInfo.getRecentlyTime()) ? dateFormat.format(dateFormat.parse(clubRemarksInfo.getRecentlyTime())) : null);
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        }
+        return ResponseJson.success(clubStatistics);
+    }
+
+    @Override
+    public ResponseJson<Map<String, Object>> selPortraitData(CmPortrait cmPortrait) {
+        List<String> labelList = new ArrayList<>();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        String endTime = "";
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        Date time = calendar.getTime();
+        endTime = dateFormat.format(time);
+        String time1 = "";
+        String time2 = "";
+        boolean expty = ObjectUtils.isEmpty(cmPortrait.getStartTime()) && ObjectUtils.isEmpty(cmPortrait.getEndTime());
+        if (expty) {
+            Date start = null;
+            String startTime = "";
+            cmPortrait.setEndTime(endTime);
+            // 日期参数为    日
+            if (1 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) {
+                cmPortrait.setStartTime(endTime);
+            }
+            if (2 == cmPortrait.getDateType()) {
+                calendar.setTime(time);
+                calendar.add(Calendar.MONTH, -1);
+                start = calendar.getTime();
+                startTime = dateFormat.format(start);
+                cmPortrait.setStartTime(startTime);
+            }
+            if (3 == cmPortrait.getDateType()) {
+                calendar.setTime(time);
+                calendar.add(Calendar.MONTH, -6);
+                start = calendar.getTime();
+                startTime = dateFormat.format(start);
+                cmPortrait.setStartTime(startTime);
+            }
+            if (4 == cmPortrait.getDateType()) {
+                calendar.setTime(time);
+                calendar.add(Calendar.YEAR, -1);
+                start = calendar.getTime();
+                startTime = dateFormat.format(start);
+                cmPortrait.setStartTime(startTime);
+            }
+        } else {
+            time1 = cmPortrait.getStartTime();
+            time2 = cmPortrait.getEndTime();
+        }
+        // 机构订单
+        if (0 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
+            if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && expty) {
+                cmPortrait.setEndTime(dateFormat.format(date));
+            }
+            if (cmPortrait.getEndTime().equals(endTime)) {
+                cmPortrait.setEndTime(dateFormat.format(date));
+            }
+            int ordinary = 0, secondHand = 0, rebate = 0, partialRefund = 0, total = 0; //, fullRefund = 0, closed = 0
+            double orderScopeTotalFee = 0.0;
+            ArrayList<OrderPortrait> orderPortraits = new ArrayList<>();
+            OrderPortrait orderPortrait = new OrderPortrait();
+            List<CmShopOrder> orderList = userMapper.selOrderList(cmPortrait);
+            int length = orderList.size();
+            NumberFormat instance = NumberFormat.getInstance();
+            instance.setMaximumFractionDigits(2);
+            if (length != 0) {
+                for (CmShopOrder order : orderList) {
+                    // 普通订单
+                    if (("0".equals(order.getSecondHandOrderFlag()) || StringUtils.isEmpty(order.getSecondHandOrderFlag()))
+                            && (!"1".equals(order.getRebateFlag()) || "".equals(order.getRebateFlag()) || StringUtils.isEmpty(order.getRebateFlag()))
+                            && (!"2".equals(order.getRefundType()) || "".equals(order.getRefundType()) || StringUtils.isEmpty(order.getRefundType()))
+                            && !"4".equals(order.getStatus())) {
+                        ordinary++;
+                    }
+                    // 二手订单
+                    if ("1".equals(order.getSecondHandOrderFlag()) && !"1".equals(order.getRebateFlag())
+                            && (!"2".equals(order.getRefundType())) && !"4".equals(order.getStatus())) {
+                        secondHand++;
+                    }
+                    orderScopeTotalFee += order.getPayTotalFee();
+                }
+                cmPortrait.setOrderTotal(length);
+                // 当前单位订单总额
+                cmPortrait.setOrderScopeTotalFee(Double.valueOf(String.format("%.2f", orderScopeTotalFee)));
+                orderPortrait.setValue(ordinary);
+                if (ordinary != 0) {
+                    orderPortrait.setName("普通订单 【" + instance.format((float) ordinary / (float) length * 100) + "%】 【" + ordinary + "个】");
+                } else {
+                    orderPortrait.setName("普通订单 【 0 %】 【" + ordinary + "个】");
+                }
+                orderPortraits.add(orderPortrait);
+                orderPortrait = new OrderPortrait();
+                orderPortrait.setValue(secondHand);
+                if (secondHand != 0) {
+                    orderPortrait.setName("二手订单 【" + instance.format((float) secondHand / (float) length * 100) + "%】 【" + secondHand + "个】");
+                } else {
+                    orderPortrait.setName("二手订单 【 0 %】 【" + secondHand + "个】");
+                }
+                orderPortraits.add(orderPortrait);
+                cmPortrait.setOrderPortrait(orderPortraits);
+            }
+            // 总量
+            total = ordinary + secondHand + rebate + partialRefund; //  + fullRefund + closed
+            cmPortrait.setOrderScopeNum(total);
+            calendar.setTime(date);
+            calendar.add(Calendar.DAY_OF_MONTH, -1);
+            time = calendar.getTime();
+            endTime = dateFormat.format(time);
+            cmPortrait.setEndTime(endTime);
+        }
+        // 搜索关键词
+        if (1 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
+            List<CmBehaviorRecord> behaviorRecordList = userMapper.selBehaviorList(cmPortrait);
+            int keywordsTotal = 0;
+            ArrayList<Integer> integers = new ArrayList<>();
+            ArrayList<String> strings = new ArrayList<>();
+            if (behaviorRecordList.size() != 0) {
+                for (CmBehaviorRecord record : behaviorRecordList) {
+                    keywordsTotal += record.getNumber();
+                    integers.add(record.getNumber());
+                    if (StringUtils.isNotBlank(record.getPageLabel())) {
+                        labelList = new ArrayList<>();
+                        String label = record.getPageLabel();
+                        if (label.endsWith(",")) {
+                            label = record.getPageLabel().substring(0, record.getPageLabel().lastIndexOf(","));
+                        }
+                        if (label.startsWith(",")) {
+                            label = record.getPageLabel().substring(record.getPageLabel().indexOf(","));
+                        }
+                        strings.add(label);
+                    } else {
+                        strings.add("未知");
+                    }
+                    cmPortrait.setTotalkeywords(behaviorRecordList.get(0).getNumbers());
+                    cmPortrait.setBehaviorValue(integers);
+                    cmPortrait.setBehaviorType(strings);
 
+                }
+            }
+            cmPortrait.setKeyWordsScopeNum(keywordsTotal);
+        }
+        // 咨询记录
+        if (2 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
+            if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && expty) {
+                cmPortrait.setEndTime(dateFormat.format(date));
+            }
+            if (cmPortrait.getEndTime().equals(endTime)) {
+                cmPortrait.setEndTime(dateFormat.format(date));
+            }
+            List<CmClubRemarks> remarksList = userMapper.selRemarksList(cmPortrait);
+            ArrayList<Integer> integers = new ArrayList<>();
+            ArrayList<String> strings = new ArrayList<>();
+            ArrayList<String> strRemark = new ArrayList<>();
+            ArrayList<String> remarkAll = new ArrayList<>();
+            int number = 0;
+            if (remarksList.size() != 0) {
+                for (CmClubRemarks remarks : remarksList) {
+                    String[] split = remarks.getRemarks().split(",");
+                    for (String str : split) {
+                        if (!strRemark.contains(str)) {
+                            strRemark.add(str);
+                        }
+                        remarkAll.add(str);
+                    }
+                }
+                for (String str : strRemark) {
+                    for (int i = 0; i < remarkAll.size(); i++) {
+                        if (str.equals(remarkAll.get(i))) {
+                            number++;
+                        }
+                    }
+                    integers.add(number);
+                    if (!ObjectUtils.isEmpty(str)) {
+                        strings.add(str);
+                    } else {
+                        strings.add("未知");
+                    }
+                    number = 0;
+                }
+                // 数组根据出现次数排序
+                int temp = 0;
+                String strTemp = "";
+                for (int i = 0; i < integers.size() - 1; i++) {
+                    for (int k = 0; k < integers.size() - 1 - i; k++) {
+                        if (integers.get(k) > integers.get(k + 1)) {
+                            temp = integers.get(k);
+                            integers.set(k, integers.get(k + 1));
+                            integers.set(k + 1, temp);
+
+                            strTemp = strings.get(k);
+                            strings.set(k, strings.get(k + 1));
+                            strings.set(k + 1, strTemp);
+                        }
+                    }
+                }
+                cmPortrait.setRemarksValue(integers);
+                cmPortrait.setRemarksType(strings);
+            }
+            cmPortrait.setRemarksScopeNum(remarksList.size());
+            calendar.setTime(date);
+            calendar.add(Calendar.DAY_OF_MONTH, -1);
+            time = calendar.getTime();
+            endTime = dateFormat.format(time);
+            cmPortrait.setEndTime(endTime);
+        }
+        // 访问记录
+        if (3 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
+            List<CmBehaviorRecord> pageTypeList = userMapper.selBehaviorPageTypeList(cmPortrait);
+            ArrayList<Integer> integers = new ArrayList<>();
+            ArrayList<String> strings = new ArrayList<>();
+            Integer number = 0;
+            if (pageTypeList.size() != 0) {
+                for (CmBehaviorRecord record : pageTypeList) {
+                    number += record.getNumbers();
+                    if (StringUtils.isNotBlank(record.getPageLabel())) {
+                        labelList = new ArrayList<>();
+                        String label = record.getPageLabel();
+                        integers.add(record.getNumbers());
+                        if (label.endsWith(",")) {
+                            label = record.getPageLabel().substring(0, record.getPageLabel().lastIndexOf(","));
+                        }
+                        if (label.startsWith(",")) {
+                            label = record.getPageLabel().substring(record.getPageLabel().indexOf(","));
+                        }
+                        strings.add(label);
+                    }
+                }
+                cmPortrait.setPageTypeValue(integers);
+                cmPortrait.setPageType(strings);
+                cmPortrait.setVisitNum(number);
+            }
+        }
+        if (!expty) {
+            cmPortrait.setStartTime(time1);
+            if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && ObjectUtils.isEmpty(cmPortrait.getStartTime())) {
+                cmPortrait.setStartTime(time2);
+            }
+            cmPortrait.setEndTime(time2);
+        }
+        Map<String, Object> map = Maps.newLinkedHashMap();
+        ArrDate order = new ArrDate();
+        ArrDate behavior = new ArrDate();
+        ArrDate remarks = new ArrDate();
+        ArrDate pageType = new ArrDate();
+
+        order.setOrderList(cmPortrait.getOrderPortrait());
+        if (cmPortrait.getOrderTotal() == null) {
+            cmPortrait.setOrderTotal(0);
+        }
+        order.setOrderTotalNum(cmPortrait.getOrderTotal());
+        order.setStartTime(cmPortrait.getStartTime());
+        order.setEndTime(cmPortrait.getEndTime());
+        if (order.getOrderTotalNum() == 0) {
+            map.put("order", null);
+        } else {
+            map.put("order", order);
+        }
+        behavior.setName(cmPortrait.getBehaviorType());
+        behavior.setValue(cmPortrait.getBehaviorValue());
+        behavior.setStartTime(cmPortrait.getStartTime());
+        behavior.setEndTime(cmPortrait.getEndTime());
+        if (ObjectUtils.isEmpty(behavior.getValue())) {
+            map.put("behavior", null);
+        } else {
+            map.put("behavior", behavior);
+        }
+        remarks.setName(cmPortrait.getRemarksType());
+        remarks.setValue(cmPortrait.getRemarksValue());
+        remarks.setStartTime(cmPortrait.getStartTime());
+        remarks.setEndTime(cmPortrait.getEndTime());
+        if (ObjectUtils.isEmpty(remarks.getValue())) {
+            map.put("remarks", null);
+        } else {
+            map.put("remarks", remarks);
+        }
+        pageType.setName(cmPortrait.getPageType());
+        pageType.setValue(cmPortrait.getPageTypeValue());
+        pageType.setStartTime(cmPortrait.getStartTime());
+        pageType.setEndTime(cmPortrait.getEndTime());
+        if (ObjectUtils.isEmpty(pageType.getValue())) {
+            map.put("pageType", null);
+        } else {
+            map.put("pageType", pageType);
+        }
+        map.put("portrait", cmPortrait);
+        return ResponseJson.success(map);
+    }
+
+    public void setClubNum(CmPortrait clubStatistics) {
+        Integer number = 0;
+        if (null != clubStatistics) {
+            // 计算资料完整度
+            if (StringUtils.isNotBlank(clubStatistics.getName())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getLinkMan())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getContractMobile())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getLinkManIdentity())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getAddress())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getBusinessLicenseImage())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getUserIdentity())) {
+                number += 10;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getSname())) {
+                number += 3;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getContractEmail())) {
+                number += 5;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getContractPhone())) {
+                number += 4;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getFax())) {
+                number += 3;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getHeadpic())) {
+                number += 5;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getSocialCreditCode())) {
+                number += 5;
+            }
+            if (StringUtils.isNotBlank(clubStatistics.getInfo())) {
+                number += 5;
+            }
+        }
+        clubStatistics.setNumber(number);
+        clubStatistics.setClubDataIntegrity(number + "%");
+    }
 }

+ 108 - 0
src/main/java/com/caimei365/manager/utils/ObjectUtils.java

@@ -0,0 +1,108 @@
+package com.caimei365.manager.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.Method;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 对象操作工具类, 继承org.apache.commons.lang3.ObjectUtils类
+ * @author ThinkGem
+ * @version 2014-6-29
+ */
+public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
+
+	/**
+	 * 注解到对象复制,只复制能匹配上的方法。
+	 * @param annotation
+	 * @param object
+	 */
+	public static void annotationToObject(Object annotation, Object object){
+		if (annotation != null){
+			Class<?> annotationClass = annotation.getClass();
+			Class<?> objectClass = object.getClass();
+			for (Method m : objectClass.getMethods()){
+				if (StringUtils.startsWith(m.getName(), "set")){
+					try {
+						String s = StringUtils.uncapitalize(StringUtils.substring(m.getName(), 3));
+						Object obj = annotationClass.getMethod(s).invoke(annotation);
+						if (obj != null && !"".equals(obj.toString())){
+							if (object == null){
+								object = objectClass.newInstance();
+							}
+							m.invoke(object, obj);
+						}
+					} catch (Exception e) {
+						// 忽略所有设置失败方法
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 序列化对象
+	 * @param object
+	 * @return
+	 */
+	public static byte[] serialize(Object object) {
+		ObjectOutputStream oos = null;
+		ByteArrayOutputStream baos = null;
+		try {
+			if (object != null){
+				baos = new ByteArrayOutputStream();
+				oos = new ObjectOutputStream(baos);
+				oos.writeObject(object);
+				return baos.toByteArray();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 反序列化对象
+	 * @param bytes
+	 * @return
+	 */
+	public static Object unserialize(byte[] bytes) {
+		ByteArrayInputStream bais = null;
+		try {
+			if (bytes != null && bytes.length > 0){
+				bais = new ByteArrayInputStream(bytes);
+				ObjectInputStream ois = new ObjectInputStream(bais);
+				return ois.readObject();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	/**
+	 * 判断对象为空
+	 *
+	 * @param obj
+	 *            对象名
+	 * @return 是否为空
+	 */
+	public static boolean isEmpty(Object obj)
+	{
+		if (obj == null)
+		{
+			return true;
+		}
+		if ((obj instanceof List))
+		{
+			return ((List) obj).size() == 0;
+		}
+		if ((obj instanceof String))
+		{
+			return ((String) obj).trim().equals("");
+		}
+		return false;
+	}
+}

+ 139 - 1
src/main/resources/mapper/user/UserMapper.xml

@@ -524,7 +524,7 @@
             <if test="customerValue != null and customerValue != ''">
                 AND covs.customerValue = #{customerValue}
             </if>
-            <if test="spID != null and spID != ''">
+            <if test="spId != null and spId != ''">
                 AND sp.serviceProviderID = #{spId}
             </if>
         </where>
@@ -537,6 +537,144 @@
         where dynamicStatus = #{dynamicStatus}
     </select>
 
+    <select id="selBehaviorList" resultType="com.caimei365.manager.entity.caimei.CmBehaviorRecord">
+        SELECT
+        c.clubId,
+        COUNT(cbr.pageLabel) as number,
+        cbr.pageLabel,
+        cbr.accessDate
+        FROM cm_behavior_record cbr LEFT JOIN club c ON cbr.userID = c.userID
+        <where>
+            cbr.pageType IN (8, 9) AND c.clubID = #{clubId} AND cbr.pageLabel IS NOT NULL AND cbr.pageLabel != ''
+            <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+                AND cbr.accessDate <![CDATA[ >= ]]> #{startTime} AND cbr.accessDate <![CDATA[ <= ]]> #{endTime}
+            </if>
+        </where>
+        GROUP BY cbr.pageLabel
+        ORDER BY COUNT(cbr.pageLabel) LIMIT 10
+    </select>
+
+    <select id="selRemarksList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks">
+        SELECT
+        (SELECT COUNT(remarks) FROM cm_club_remarks WHERE clubID = #{clubID}) as numbers,
+        clubId,
+        COUNT(remarks) as number,
+        remarks,
+        addTime
+        FROM cm_club_remarks
+        <where>
+            clubID = #{clubId}
+            <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+                AND addTime <![CDATA[ >= ]]> #{startTime} AND addTime <![CDATA[ <= ]]> #{endTime}
+            </if>
+        </where>
+        GROUP BY remarks ORDER BY COUNT(remarks) LIMIT 10
+    </select>
+
+    <select id="selBehaviorPageTypeList" resultType="com.caimei365.manager.entity.caimei.CmBehaviorRecord">
+        SELECT
+        c.clubId,
+        COUNT(cbr.pageType) as numbers,
+        cbr.pageLabel,
+        cbr.accessDate
+        FROM cm_behavior_record cbr
+        LEFT JOIN club c ON cbr.userID = c.userID
+        <where>
+            c.clubID = #{clubId}
+            <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+                AND cbr.accessDate <![CDATA[ >= ]]> #{startTime} AND cbr.accessDate <![CDATA[ <= ]]> #{endTime}
+            </if>
+        </where>
+        GROUP BY cbr.pageType  ORDER BY COUNT(cbr.pageType)
+    </select>
+
+    <select id="selOrderList" resultType="com.caimei365.manager.entity.caimei.CmShopOrder">
+        SELECT
+        DISTINCT cso.shopOrderId as shopOrderId,
+        (SELECT COUNT(shopOrderId) FROM cm_shop_order WHERE clubID = #{clubId} AND shopStatus != 4 AND shopStatus != 5 AND refundStatus != 2 AND orderTime <![CDATA[ < ]]> NOW()) AS orderTotal,
+        (SELECT IFNULL(SUM(totalAmount), 0) FROM cm_shop_order WHERE clubID = #{clubId} AND shopStatus != 4 AND shopStatus != 5 AND refundStatus != 2 AND orderTime <![CDATA[ < ]]> NOW()) AS orderTotalAmount,
+        cso.clubId,
+        co.secondHandOrderFlag,
+        co.rebateFlag,
+        cso.totalAmount AS payTotalFee,
+        ifnull(cso.refundStatus,1) as refundType,
+        cso.shopStatus AS STATUS,
+        cso.orderTime
+        FROM cm_shop_order cso
+        LEFT JOIN cm_order co ON cso.orderId = co.orderId
+        LEFT JOIN cm_order_product cop ON cso.shopOrderId = cop.shopOrderId
+        <where>
+            cso.clubID = #{clubId} AND cso.shopStatus != 4 AND cso.shopStatus != 5 AND cso.refundStatus != 2 AND cop.productId != 999
+            <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+                AND cso.orderTime <![CDATA[ >= ]]> #{startTime} AND cso.orderTime <![CDATA[ <= ]]> #{endTime}
+            </if>
+        </where>
+    </select>
+
+    <select id="getClubRemarksInfo" resultType="com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks">
+        SELECT id, communicationSituation, communicationMethods,
+               customerSource, customerGender, customerAge, groupAddition,addTime,
+               (SELECT ADDTIME FROM cm_club_remarks WHERE clubId = #{clubId} ORDER BY ADDTIME ASC LIMIT 1) AS firstTime,
+               (SELECT ADDTIME FROM cm_club_remarks WHERE clubId = #{clubId} ORDER BY ADDTIME DESC LIMIT 1) AS recentlyTime
+        FROM cm_club_remarks WHERE clubId = #{clubId} ORDER BY ADDTIME DESC LIMIT 1
+    </select>
+
+    <select id="selClubData" resultType="com.caimei365.manager.entity.caimei.cmUser.CmPortrait">
+        select
+            (SELECT COUNT(shopOrderId) FROM cm_shop_order WHERE clubID = #{clubId} AND shopStatus != 4 AND shopStatus != 5 AND refundStatus != 2 AND orderTime <![CDATA[ < ]]> NOW()) AS orderTotal,
+            (SELECT IFNULL(SUM(totalAmount), 0) FROM cm_shop_order WHERE clubID = #{clubId} AND shopStatus != 4 AND shopStatus != 5 AND refundStatus != 2 AND orderTime <![CDATA[ < ]]> NOW()) AS orderTotalAmount,
+            (SELECT COUNT(cbr.recordID) FROM cm_behavior_record cbr LEFT JOIN club c ON cbr.userID = c.userID WHERE cbr.pageType IN (8, 9) AND c.clubID = #{clubId} AND cbr.accessDate <![CDATA[ < ]]> now()) AS totalkeywords ,
+            (SELECT COUNT(remarks) FROM cm_club_remarks WHERE clubID = #{clubId} AND addTime <![CDATA[ < ]]> now()) AS remarksTotal,
+            (SELECT COUNT(cbr.recordID) FROM cm_behavior_record cbr LEFT JOIN club c ON cbr.userID = c.userID WHERE c.clubID = #{clubId} AND cbr.accessDate <![CDATA[ < ]]> NOW()) AS visitTotal,
+            c.clubId,
+            c.name,
+            c.linkMan,
+            c.contractMobile,
+            c.linkManIdentity,
+            c.address,
+            c.businessLicenseImage,
+            u.userIdentity,
+            c.sname,
+            c.contractEmail,
+            c.contractPhone,
+            c.fax,
+            c.headpic,
+            c.socialCreditCode,
+            c.info,
+            (CASE WHEN c.linkManIdentity=1 THEN '老板'
+                  WHEN c.linkManIdentity=2 THEN '采购'
+                  WHEN c.linkManIdentity=3 THEN '运营'
+                  WHEN c.linkManIdentity=4 THEN '其他'
+                END) AS linkManStatus,
+            d.name AS province,
+            ct.name AS city,
+            b.name AS  town,
+            (CASE WHEN c.firstClubType=1 THEN '医美'
+                  WHEN c.firstClubType=2 THEN '生美'
+                  WHEN c.firstClubType=3 THEN '项目公司'
+                  WHEN c.firstClubType=4 THEN '个人'
+                  ELSE '其他' END) AS firstClubType,
+            (CASE WHEN c.secondClubType=1 THEN '诊所'
+                  WHEN c.secondClubType=2 THEN '门诊'
+                  WHEN c.secondClubType=3 THEN '医院'
+                  WHEN c.secondClubType=5 THEN '美容院'
+                  WHEN c.secondClubType=6 THEN '养生馆'
+                  WHEN c.secondClubType=7 THEN '其他'
+                END) AS classify,
+            u.registerTime as registerTime,
+            coas.activeState as activeState,
+            covs.customerValue as customerValues,
+            c.addTime AS addTime
+        FROM club c
+        LEFT JOIN USER u ON u.userID = c.userID
+        LEFT JOIN town b ON b.townID=c.townID
+        LEFT JOIN city ct ON ct.cityID=c.cityID
+        LEFT JOIN province d ON d.provinceID=c.provinceID
+        LEFT JOIN (SELECT userID, customerValue FROM cm_organ_value_system WHERE stage = 0 AND delType = 1) AS covs ON covs.userID = c.userID
+        LEFT JOIN (SELECT userID, activeState FROM cm_organ_active_system WHERE stage = 0 AND delType = 1) AS coas ON coas.userID = c.userID
+        where c.clubID = #{clubId}
+    </select>
+
     <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="userID">
         insert into user
         <trim prefix="(" suffix=")" suffixOverrides=",">