Bladeren bron

Merge branch 'test' of jishutao/kede-server into prod

anderx 9 maanden geleden
bovenliggende
commit
b3b0f3933e
34 gewijzigde bestanden met toevoegingen van 724 en 139 verwijderingen
  1. 6 0
      .gitignore
  2. 144 0
      src/main/java/com/company/Main.java
  3. 106 0
      src/main/java/com/goafanti/admin/bo/selectAllUserDataBo.java
  4. 19 0
      src/main/java/com/goafanti/admin/controller/AdminStatisticsController.java
  5. 5 0
      src/main/java/com/goafanti/admin/service/AdminStatisticsService.java
  6. 46 0
      src/main/java/com/goafanti/admin/service/impl/AdminStatisticsServiceImpl.java
  7. 7 0
      src/main/java/com/goafanti/admin/service/impl/NewAdminServiceImpl.java
  8. 2 0
      src/main/java/com/goafanti/common/dao/AdminMapper.java
  9. 1 1
      src/main/java/com/goafanti/common/dao/UserMapper.java
  10. 44 0
      src/main/java/com/goafanti/common/mapper/AdminMapper.xml
  11. 2 1
      src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml
  12. 2 1
      src/main/java/com/goafanti/common/mapper/RoleResourcesMapper.xml
  13. 1 1
      src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml
  14. 1 1
      src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml
  15. 1 0
      src/main/java/com/goafanti/common/mapper/UserMapper.xml
  16. 2 1
      src/main/java/com/goafanti/common/mapper/UserTransferLogMapper.xml
  17. 55 81
      src/main/java/com/goafanti/common/task/OrderDunTask.java
  18. 1 0
      src/main/java/com/goafanti/common/utils/DateUtils.java
  19. 31 10
      src/main/java/com/goafanti/core/shiro/filter/AdminFilter.java
  20. 8 8
      src/main/java/com/goafanti/core/shiro/filter/LoginFilter.java
  21. 6 11
      src/main/java/com/goafanti/core/shiro/filter/ShiroFilterUtils.java
  22. 29 0
      src/main/java/com/goafanti/customer/bo/transferListBo.java
  23. 45 13
      src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java
  24. 1 2
      src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseCountsServiceImpl.java
  25. 2 0
      src/main/java/com/goafanti/order/controller/AdminNewOrderApiController.java
  26. 2 1
      src/main/java/com/goafanti/order/controller/OrderChangeApiController.java
  27. 8 2
      src/main/java/com/goafanti/order/service/impl/OrderChangeServiceImpl.java
  28. 2 1
      src/main/java/com/goafanti/order/service/impl/PushOrderService.java
  29. 3 1
      src/main/java/com/goafanti/permission/service/impl/NewRoleServiceImpl.java
  30. 9 0
      src/main/java/com/goafanti/weChat/bo/OutPublicReleaseList.java
  31. 2 1
      src/main/java/com/goafanti/weChat/service/impl/PublicReleaseServiceImpl.java
  32. 128 0
      src/main/java/com/tencent/wework/Finance.java
  33. 2 1
      src/main/resources/props/config_local.properties
  34. 1 1
      src/main/resources/props/config_test.properties

+ 6 - 0
.gitignore

@@ -16,3 +16,9 @@
 
 /qodana.yaml
 
+/src/libcrypto-3-x64.dll
+/libcrypto-3-x64.dll
+/src/libcurl-x64.dll
+/libcurl-x64.dll
+/src/WeWorkFinanceSdk.dll
+/WeWorkFinanceSdk.dll

+ 144 - 0
src/main/java/com/company/Main.java

@@ -0,0 +1,144 @@
+package com.company;
+
+import com.tencent.wework.Finance;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+//10000	参数错误,请求参数错误
+//10001	网络错误,网络请求错误
+//10002	数据解析失败
+//10003	系统失败
+//10004	密钥错误导致加密失败
+//10005	fileid错误
+//10006	解密失败
+//10007 找不到消息加密版本的私钥,需要重新传入私钥对
+//10008 解析encrypt_key出错
+//10009 ip非法
+//10010 数据过期
+
+public class Main {
+    public static void main(String[] args){
+
+        //seq 表示该企业存档消息序号,该序号单调递增,拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时seq传0,sdk会返回有效期内最早的消息。
+        //limit 表示本次拉取的最大消息条数,取值范围为1~1000
+        //proxy与passwd为代理参数,如果运行sdk的环境不能直接访问外网,需要配置代理参数。sdk访问的域名是"https://qyapi.weixin.qq.com"。
+        //建议先通过curl访问"https://qyapi.weixin.qq.com",验证代理配置正确后,再传入sdk。
+        //timeout 为拉取会话存档的超时时间,单位为秒,建议超时时间设置为5s。
+        //sdkfileid 媒体文件id,从解密后的会话存档中得到
+        //savefile 媒体文件保存路径
+        //encrypt_key 拉取会话存档返回的encrypt_random_key,使用配置在企业微信管理台的rsa公钥对应的私钥解密后得到encrypt_key。
+        //encrypt_chat_msg 拉取会话存档返回的encrypt_chat_msg
+        if (args.length < 2) {
+            System.out.println("./sdktools 1(chatmsg) 2(mediadata) 3(decryptdata)\n");
+            System.out.println("./sdktools 1 seq limit proxy passwd timeout\n");
+            System.out.println("./sdktools 2 fileid proxy passwd timeout savefile\n");
+            System.out.println("./sdktools 3 encrypt_key encrypt_chat_msg\n");
+            return;
+        }
+
+        long ret = 0;
+        //使用sdk前需要初始化,初始化成功后的sdk可以一直使用。
+        //如需并发调用sdk,建议每个线程持有一个sdk实例。
+        //初始化时请填入自己企业的corpid与secrectkey。
+        long sdk = Finance.NewSdk();
+        ret = Finance.Init(sdk, "wwd1f2fb82952be74c", "zJ*****************************ew");
+        System.out.println(ret);
+        String arg0 = args[0];
+        arg0="1";
+        if(ret != 0){
+            Finance.DestroySdk(sdk);
+            System.out.println("init sdk err ret " + ret);
+            return;
+        }else {
+            System.out.println("init sdk ok");
+        }
+        if (arg0.equals("1")) {
+            //拉取会话存档
+            int seq = Integer.parseInt(args[1]);
+            int limit = Integer.parseInt(args[2]);
+            String proxy = args[3];
+            String passwd = args[4];
+            int timeout = Integer.parseInt(args[5]);
+
+            //每次使用GetChatData拉取存档前需要调用NewSlice获取一个slice,在使用完slice中数据后,还需要调用FreeSlice释放。
+            long slice = Finance.NewSlice();
+            ret = Finance.GetChatData(sdk, seq, limit, proxy, passwd, timeout, slice);
+            System.out.println("==============="+ret);
+            if (ret != 0) {
+                System.out.println("getchatdata ret " + ret);
+                Finance.FreeSlice(slice);
+                return;
+            }
+            System.out.println("getchatdata :" + Finance.GetContentFromSlice(slice));
+            Finance.FreeSlice(slice);
+        }
+        else if (args[0].equals("2")) {
+            //拉取媒体文件
+            String sdkfileid = args[1];
+            String proxy = args[2];
+            String passwd = args[3];
+            int timeout = Integer.parseInt(args[4]);
+            String savefile = args[5];
+
+            //媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。若该文件未拉取完整,sdk的IsMediaDataFinish接口会返回0,同时通过GetOutIndexBuf接口返回下次拉取需要传入GetMediaData的indexbuf。
+            //indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“,表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。
+            String indexbuf = "";
+            while(true){
+                //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
+                long media_data = Finance.NewMediaData();
+                ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, proxy, passwd, timeout, media_data);
+                if(ret!=0){
+                    System.out.println("getmediadata ret:" + ret);
+                    Finance.FreeMediaData(media_data);
+                    return;
+                }
+                System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data));
+                try {
+                    //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
+                    FileOutputStream outputStream  = new FileOutputStream(new File(savefile), true);
+                    outputStream.write(Finance.GetData(media_data));
+                    outputStream.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+                if(Finance.IsMediaDataFinish(media_data) == 1)
+                {
+                    //已经拉取完成最后一个分片
+                    Finance.FreeMediaData(media_data);
+                    break;
+                }
+                else
+                {
+                    //获取下次拉取需要使用的indexbuf
+                    indexbuf = Finance.GetOutIndexBuf(media_data);
+                    Finance.FreeMediaData(media_data);
+                }
+            }
+        }
+        else if (args[0].equals("3")) {
+            //解密会话存档内容
+            //sdk不会要求用户传入rsa私钥,保证用户会话存档数据只有自己能够解密。
+            //此处需要用户先用rsa私钥解密encrypt_random_key后,作为encrypt_key参数传入sdk来解密encrypt_chat_msg获取会话存档明文。
+            String encrypt_key = args[1];
+            String encrypt_chat_msg = args[2];
+
+            //每次使用DecryptData解密会话存档前需要调用NewSlice获取一个slice,在使用完slice中数据后,还需要调用FreeSlice释放。
+            long msg = Finance.NewSlice();
+            ret = Finance.DecryptData(sdk, encrypt_key, encrypt_chat_msg, msg);
+            if (ret != 0) {
+                System.out.println("getchatdata ret " + ret);
+                Finance.FreeSlice(msg);
+                return;
+            }
+            System.out.println("decrypt ret:" + ret + " msg:" + Finance.GetContentFromSlice(msg));
+            Finance.FreeSlice(msg);
+        }
+        else {
+            System.out.println("wrong args " + args[0]);
+        }
+        Finance.DestroySdk(sdk);
+    }
+}
+

+ 106 - 0
src/main/java/com/goafanti/admin/bo/selectAllUserDataBo.java

@@ -0,0 +1,106 @@
+package com.goafanti.admin.bo;
+
+import com.goafanti.common.utils.excel.Excel;
+
+public class selectAllUserDataBo {
+    @Excel(name = "部门名称")
+    private String depName;
+    @Excel(name = "管理员名称")
+    private String name;
+    @Excel(name = "日客户")
+    private Integer dayCustomer;
+    @Excel(name = "日面谈")
+    private Integer dayMeet;
+    @Excel(name = "周客户")
+    private Integer weekCustomer;
+    @Excel(name = "周面谈")
+    private Integer weekMeet;
+    @Excel(name = "月客户")
+    private Integer monthCustomer;
+    @Excel(name = "月面谈")
+    private Integer monthMeet;
+    @Excel(name = "年客户")
+    private Integer yearCustomer;
+    @Excel(name = "年面谈")
+    private Integer yearMeet;
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getDayCustomer() {
+        return dayCustomer;
+    }
+
+    public void setDayCustomer(Integer dayCustomer) {
+        this.dayCustomer = dayCustomer;
+    }
+
+    public Integer getDayMeet() {
+        return dayMeet;
+    }
+
+    public void setDayMeet(Integer dayMeet) {
+        this.dayMeet = dayMeet;
+    }
+
+    public Integer getWeekCustomer() {
+        return weekCustomer;
+    }
+
+    public void setWeekCustomer(Integer weekCustomer) {
+        this.weekCustomer = weekCustomer;
+    }
+
+    public Integer getWeekMeet() {
+        return weekMeet;
+    }
+
+    public void setWeekMeet(Integer weekMeet) {
+        this.weekMeet = weekMeet;
+    }
+
+    public Integer getMonthCustomer() {
+        return monthCustomer;
+    }
+
+    public void setMonthCustomer(Integer monthCustomer) {
+        this.monthCustomer = monthCustomer;
+    }
+
+    public Integer getMonthMeet() {
+        return monthMeet;
+    }
+
+    public void setMonthMeet(Integer monthMeet) {
+        this.monthMeet = monthMeet;
+    }
+
+    public Integer getYearCustomer() {
+        return yearCustomer;
+    }
+
+    public void setYearCustomer(Integer yearCustomer) {
+        this.yearCustomer = yearCustomer;
+    }
+
+    public Integer getYearMeet() {
+        return yearMeet;
+    }
+
+    public void setYearMeet(Integer yearMeet) {
+        this.yearMeet = yearMeet;
+    }
+}

+ 19 - 0
src/main/java/com/goafanti/admin/controller/AdminStatisticsController.java

@@ -2,8 +2,10 @@ package com.goafanti.admin.controller;
 
 import com.goafanti.admin.bo.AdminPublicDuration;
 import com.goafanti.admin.bo.AdminPublicDurationCount;
+import com.goafanti.admin.bo.selectAllUserDataBo;
 import com.goafanti.admin.service.AdminStatisticsService;
 import com.goafanti.common.bo.Result;
+import com.goafanti.common.constant.AFTConstants;
 import com.goafanti.common.controller.CertifyApiController;
 import com.goafanti.common.utils.excel.NewExcelUtil;
 import com.goafanti.core.shiro.token.TokenManager;
@@ -13,6 +15,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -174,4 +177,20 @@ public class AdminStatisticsController extends CertifyApiController {
         }
     }
 
+
+    /**
+     * 统计日周月年客户与面谈
+     */
+    @RequestMapping(value = "/AllDataExport", method = RequestMethod.GET)
+    public Result AllDataExport( HttpServletResponse response) {
+        //管理员与曾妹涵账号有权限导出
+        if (TokenManager.hasRole(AFTConstants.SUPERADMIN)||TokenManager.getAdminId().equals("a7661bcf-bdca-484e-baef-6f52b305aeae")){
+            List<selectAllUserDataBo> list = adminStatisticsService.AllDataExport();
+            NewExcelUtil<selectAllUserDataBo> newExcelUtil=new NewExcelUtil<>(selectAllUserDataBo.class);
+            return newExcelUtil.exportExcel(list,"统计所有用户数据",response);
+        }
+        return new Result<>("账号权限不足");
+
+    }
+
 }

+ 5 - 0
src/main/java/com/goafanti/admin/service/AdminStatisticsService.java

@@ -1,5 +1,8 @@
 package com.goafanti.admin.service;
 
+import com.goafanti.admin.bo.selectAllUserDataBo;
+
+import java.util.List;
 import java.util.Map;
 
 public interface AdminStatisticsService {
@@ -20,4 +23,6 @@ public interface AdminStatisticsService {
     Object salesTeamClean();
 
     Map<String,Object> monthData(String month);
+
+    List<selectAllUserDataBo> AllDataExport();
 }

+ 46 - 0
src/main/java/com/goafanti/admin/service/impl/AdminStatisticsServiceImpl.java

@@ -610,6 +610,52 @@ public class AdminStatisticsServiceImpl implements AdminStatisticsService {
         return map;
     }
 
+    @Override
+    public List<selectAllUserDataBo> AllDataExport() {
+        // 获取今天,明天,本周第一天,下周第一天,本月第一天,下月第一天,本年第一天,下年第一天
+        Date today = new Date();
+        //获取明天
+        Calendar md = Calendar.getInstance();
+        md.setTime(today);
+        md.add(Calendar.DATE, 1);
+        Date tomorrow = md.getTime();
+        //获取本周的第一天
+        Date firstDayOfWeek = DateUtils.getFirstDayOfWeek(today);
+        //获取下周的第一天
+        Calendar c = Calendar.getInstance();
+        c.setTime(firstDayOfWeek);
+        c.add(Calendar.DATE, 7);
+        Date firstDayOfNextWeek = c.getTime();
+        //获取本月的第一天
+        Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(today);
+        //获取下月的第一天
+        Calendar c2 = Calendar.getInstance();
+        c2.setTime(firstDayOfMonth);
+        c2.add(Calendar.MONTH, 1);
+        Date firstDayOfNextMonth = c2.getTime();
+        //获取本年的第一天
+        Calendar c3 = Calendar.getInstance();
+        c3.setTime(today);
+        c3.set(Calendar.DAY_OF_YEAR, 1);
+        c3.set(Calendar.HOUR_OF_DAY, 0);
+        Date firstDayOfYear = c3.getTime();
+        //获取下年的第一天
+        Calendar c4 = Calendar.getInstance();
+        c4.setTime(firstDayOfYear);
+        c4.add(Calendar.YEAR, 1);
+        Date firstDayOfNextYear = c4.getTime();
+        // 将日期转换为字符串
+        String d1 = DateUtils.formatDate(today, AFTConstants.YYYYMMDD);
+        String d2 = DateUtils.formatDate(tomorrow, AFTConstants.YYYYMMDD);
+        String w1 = DateUtils.formatDate(firstDayOfWeek, AFTConstants.YYYYMMDD);
+        String w2 = DateUtils.formatDate(firstDayOfNextWeek, AFTConstants.YYYYMMDD);
+        String m1 = DateUtils.formatDate(firstDayOfMonth, AFTConstants.YYYYMMDD);
+        String m2 = DateUtils.formatDate(firstDayOfNextMonth, AFTConstants.YYYYMMDD);
+        String y1 = DateUtils.formatDate(firstDayOfYear, AFTConstants.YYYYMMDD);
+        String y2 = DateUtils.formatDate(firstDayOfNextYear, AFTConstants.YYYYMMDD);
+        List<selectAllUserDataBo> list = adminMapper.selectAllUserData(d1, d2, w1, w2, m1, m2, y1, y2);
+        return list;
+    }
 
 
     private void pushAdminNameAndProvince(String aid, AdminPublicDuration a) {

+ 7 - 0
src/main/java/com/goafanti/admin/service/impl/NewAdminServiceImpl.java

@@ -75,6 +75,13 @@ public class NewAdminServiceImpl extends BaseMybatisDao<AdminMapper> implements
 			ls.add(role.getRoleName());
 		}
 		i.setRolesName(ls);
+		List<AdminPublicReviewerBo> list = adminPublicReviewerMapper.selectByAid(i.getId());
+		List<AdminPublicReviewerBo> collect = list.stream().filter(e -> e.getType() == 2).collect(Collectors.toList());
+		StringBuilder sb = new StringBuilder();
+		for (AdminPublicReviewerBo e : collect) {
+			sb.append(e.getReviewerName()).append(",");
+		}
+		i.setSuperior(sb.substring(0,sb.length()-1));
 	}
 
 	@Override

+ 2 - 0
src/main/java/com/goafanti/common/dao/AdminMapper.java

@@ -284,6 +284,8 @@ public interface AdminMapper {
     AdminStatisticsBo selectUserCount(@Param("aid") String aid, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
     void updateManagerId(Admin ad);
+
+    List<selectAllUserDataBo> selectAllUserData(@Param("d1") String d1, @Param("d2") String d2, @Param("w1") String w1, @Param("w2") String w2, @Param("m1") String m1, @Param("m2") String m2, @Param("y1") String y1, @Param("y2") String y2);
 }
 
 

+ 1 - 1
src/main/java/com/goafanti/common/dao/UserMapper.java

@@ -221,7 +221,7 @@ public interface UserMapper {
 
     int checkCustomerInformation(String uid);
 
-    void updateDimissionTransfer(@Param("aid")String aid, @Param("transferId")String transferId);
+    void updateDimissionTransfer(@Param("aid")String aid, @Param("transferId")String transferId, @Param("date") Date date);
 
     List<userDataListBo> userDataStatistics(@Param("deps")List<String> deps);
 

+ 44 - 0
src/main/java/com/goafanti/common/mapper/AdminMapper.xml

@@ -1332,5 +1332,49 @@
         AND aid = #{aid}
         group by aid
     </select>
+    <select id="selectAllUserData" resultType="com.goafanti.admin.bo.selectAllUserDataBo">
+        select dep.name depName,a.name ,ifnull(b.counts,0) dayCustomer,ifnull(c.counts,0) dayMeet,ifnull(b1.counts,0) weekCustomer,ifnull(c1.counts,0) weekMeet,
+               ifnull(b2.counts,0) monthCustomer,ifnull(c2.counts,0) monthMeet,ifnull(b3.counts,0) yearCustomer,ifnull(c3.counts,0) yearMeet
+        from admin a
+                 left join (select aid ,count(*)counts  from user
+                            where share_type in (0,2)and source in (1,2)
+                              and transfer_time BETWEEN #{d1} and #{d2}
+                            group by aid) b on a.id =b.aid
+                 left join (SELECT a.aid,count(*) counts
+                            from public_release a left join public_release_details b on a.id =b.prid
+                            where a.status =2 and b.clock_in =1
+                              and  a.release_start BETWEEN #{d1} and #{d2}
+                            group by a.aid)c on a.id=c.aid
+                 left join (select aid ,count(*)counts  from user
+                            where share_type in (0,2)and source in (1,2)
+                              and transfer_time BETWEEN #{w1} and #{w2}
+                            group by aid) b1 on a.id =b1.aid
+                 left join (SELECT a.aid,count(*) counts
+                            from public_release a left join public_release_details b on a.id =b.prid
+                            where a.status =2 and b.clock_in =1
+                              and  a.release_start BETWEEN #{w1} and #{w2}
+                            group by a.aid)c1 on a.id=c1.aid
+                 left join (select aid ,count(*)counts  from user
+                            where share_type in (0,2)and source in (1,2)
+                              and transfer_time BETWEEN #{m1} and #{m2}
+                            group by aid) b2 on a.id =b2.aid
+                 left join (SELECT a.aid,count(*) counts
+                            from public_release a left join public_release_details b on a.id =b.prid
+                            where a.status =2 and b.clock_in =1
+                              and  a.release_start BETWEEN #{m1} and #{m2}
+                            group by a.aid)c2 on a.id=c2.aid
+                 left join (select aid ,count(*)counts  from user
+                            where share_type in (0,2)and source in (1,2)
+                              and transfer_time BETWEEN #{y1} and #{y2}
+                            group by aid) b3 on a.id =b3.aid
+                 left join (SELECT a.aid,count(*) counts
+                            from public_release a left join public_release_details b on a.id =b.prid
+                            where a.status =2 and b.clock_in =1
+                              and  a.release_start BETWEEN  #{y1} and #{y2}
+                            group by a.aid)c3 on a.id=c3.aid
+                 left join user_role d on a.id =d.uid left join `role` e on d.rid =e.id
+                 left join department dep on a.department_id =dep.id
+        where a.status ='0' and e.role_type in ('96','996')
+    </select>
 </mapper>
 

+ 2 - 1
src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml

@@ -664,6 +664,7 @@
 
     <select id="listPublicRelease" resultType="com.goafanti.weChat.bo.OutPublicReleaseList">
         select a.id ,c.name  aname,date_format(a.release_start,'%Y-%m-%d %H:%i:%S') releaseStarts,a.aid,a.public_type publicType,a.order_no orderNo,
+        ton.contract_no contractNo,
         date_format(a.release_end ,'%Y-%m-%d %H:%i:%S') releaseEnds,date_format(a.create_time ,'%Y-%m-%d %H:%i:%S') createTimes,a.status,
         date_format(a.update_time ,'%Y-%m-%d %H:%i:%S') updateTimes,a.update_status updateStatus,a.district_name districtName,
         a.assist,a.assist_aid assistAid,a.assist_aid_name assistAidName,a.type,a.main_name mainName,a.reject_name rejectName,
@@ -681,8 +682,8 @@
             left join public_release_details b on a.id=b.prid
             left join user e on b.uid=e.id  left join admin ad on e.aid=ad.id
         </if>
-        <if test="type==5">
             left join t_order_new ton on a.order_no =ton.order_no
+        <if test="type==5">
             left join t_order_mid tom on a.order_no=tom.order_no
         </if>
         <if test="type==1">

+ 2 - 1
src/main/java/com/goafanti/common/mapper/RoleResourcesMapper.xml

@@ -326,7 +326,8 @@ where a.id= #{aid,jdbcType=VARCHAR}
   <update id="updateLockRelease" parameterType="java.lang.String">
      update  user_lock_release 
 	 set aid=#{transferId,jdbcType=VARCHAR}
-	 where aid = #{aid,jdbcType=VARCHAR}
+     ,lock_time= now()
+     where aid = #{aid,jdbcType=VARCHAR}
 	 and type=#{type,jdbcType=VARCHAR}
 	 and status=0
 </update>

+ 1 - 1
src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml

@@ -1267,7 +1267,7 @@
     </select>
     <!-- 通过订单编号获得订单的负责人(营销员) -->
     <select id="getSaleIdByOno" parameterType="java.lang.String" resultType="com.goafanti.order.bo.TOrderNewBo">
-        select o.order_no orderNo ,o.salesman_id as salesmanId, a.name as salesmanName,e.name managerName,
+        select o.order_no orderNo ,o.salesman_id as salesmanId, a.name as salesmanName,e.name managerName,o.delete_sign deleteSign,
                o.contract_no contractNo,a.email ,u.nickname as userName,o.order_dep orderDep,d.name departmentName,
                d.finance_id  financeId,d.approval approvalStatus,d.approval_aid approvalAid,ad.name approvalName,
                d.operation_guarantee_id operationGuaranteeId,ad2.name operationGuaranteeName

+ 1 - 1
src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml

@@ -370,7 +370,7 @@
 
   <update id="updateUserTypeLockList">
   	update user_lock_release set status = #{newStatus} , release_time= #{date}
-  	where aid = #{aid} and type = 0 and type = #{type} and uid in
+  	where aid = #{aid}  and type = #{type} and uid in
 	<foreach item="item" collection="list" separator="," open="(" close=")" index="">
        #{item}
     </foreach>

+ 1 - 0
src/main/java/com/goafanti/common/mapper/UserMapper.xml

@@ -1256,6 +1256,7 @@
         update user
         set aid=#{transferId,jdbcType=VARCHAR},
             information_maintainer=#{transferId,jdbcType=VARCHAR},
+            transfer_time=now(),
             source=3
         where aid=#{aid,jdbcType=VARCHAR}
     </update>

+ 2 - 1
src/main/java/com/goafanti/common/mapper/UserTransferLogMapper.xml

@@ -166,7 +166,8 @@
     where id = #{id,jdbcType=INTEGER}
   </update>
   <select id="selectByUidGetList" resultType="com.goafanti.customer.bo.transferListBo">
-	select a.id,a.type,b.nickname userName,c.name usedAName,d.name newAName,e.bname Pname, 
+	select a.id,a.type,b.nickname userName,c.name usedAName,d.name newAName,e.bname Pname,
+	       a.aid,a.uid,a.take_aid takeAid,
   	date_format(a.create_time,'%Y-%m-%d %H:%i:%S') as createDate,remarks
   	from user_transfer_log a left join user b on a.uid=b.id
 	left join admin c on a.aid=c.id left join admin d on a.take_aid=d.id

+ 55 - 81
src/main/java/com/goafanti/common/task/OrderDunTask.java

@@ -1,7 +1,6 @@
 package com.goafanti.common.task;
 
 
-import com.goafanti.admin.bo.AdminListBo;
 import com.goafanti.common.bo.EmailBo;
 import com.goafanti.common.bo.ErrorDunListBo;
 import com.goafanti.common.constant.AFTConstants;
@@ -13,7 +12,6 @@ import com.goafanti.common.model.TOrderMid;
 import com.goafanti.common.model.TOrderNew;
 import com.goafanti.common.utils.AsyncUtils;
 import com.goafanti.common.utils.LoggerUtils;
-import com.goafanti.core.shiro.token.TokenManager;
 import com.goafanti.order.bo.*;
 import com.goafanti.order.enums.OrderDunProjectType;
 import com.goafanti.order.service.LegalAffairsService;
@@ -241,88 +239,64 @@ public class OrderDunTask {
 	* 	每月1号凌晨4点轮询处理需要欠款催款的信息
 	*
 	*/
-	@Scheduled(cron = "0 0 4 1 * ?")
+//	@Scheduled(cron = "0 0 4 1 * ?")
+	@Scheduled(cron = "0 33 9 * * ?")
 //	@RequestMapping(value = "/open/pushOrderArrearsDun", method = RequestMethod.GET)
-	public void pushOrderArrearsDun(){
-		try {
-			LoggerUtils.debug(logger, "======================欠款催款启动===================");
-			Date date=new Date();
-			//运算 list(未启动) list2(催款中) list3(已完成)订单的欠款催款
-			List<TArrearsDun> list=tArrearsDunMapper.selectStatusAll(0);
-			List<TArrearsDun> list2=tArrearsDunMapper.selectStatusAll(1);
-			List<TArrearsDun> list3=tArrearsDunMapper.selectStatusAndAmount(2);
-			for (TArrearsDun td : list) {
-				TOrderNewBo b  = tOrderNewMapper.getSaleIdByOno(td.getOrderNo());
-
-
-				TOrderMid tm=tOrderMidMapper.selectByOrderNo(td.getOrderNo());
-				//如果欠款大于0则需要触发邮件
-				if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
-					td.setDunStatus(1);
-					td.setStartTime(date);
-					td.setOrderArrears(tm.getOrderArrears());
-					td.setOrderReceivables(tm.getOrderReceivables());
-					orderNewService.addNotic(NoticeStatus.ORDER_ARREARS_DUN.getCode(),b,null);
-					tArrearsDunMapper.updateByPrimaryKeySelective(td);
-				}else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
-					td.setDunStatus(2);
-					td.setEndTime(date);
-					td.setOrderArrears(tm.getOrderArrears());
-					tArrearsDunMapper.updateByPrimaryKeySelective(td);
-				}
-				Thread.sleep(2000);
-			}
-			for (TArrearsDun ta : list2) {
-				TOrderMid tm=tOrderMidMapper.selectByOrderNo(ta.getOrderNo());
-				TOrderNewBo b  = tOrderNewMapper.getSaleIdByOno(ta.getOrderNo());
-				//如果欠款大于0则需要触发邮件
-				if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
-					ta.setDunStatus(3);
-					tArrearsDunMapper.updateByPrimaryKeySelective(ta);
-					ta.setId(null);
-					ta.setDunStatus(1);
-					ta.setStartTime(date);
-					ta.setOrderArrears(tm.getOrderArrears());
-					ta.setOrderReceivables(tm.getOrderReceivables());
-					tArrearsDunMapper.insertSelective(ta);
-					orderNewService.addNotic(NoticeStatus.ORDER_ARREARS_DUN.getCode(),b,null);
-				}else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
-					ta.setDunStatus(2);
-					ta.setOrderArrears(tm.getOrderArrears());
-					tArrearsDunMapper.updateByPrimaryKeySelective(ta);
-				}
-				Thread.sleep(2000);
+	public void pushOrderArrearsDun() {
+    try {
+        LoggerUtils.debug(logger, "======================欠款催款启动===================");
+        Date date = new Date();
+
+        List<TArrearsDun> list = tArrearsDunMapper.selectStatusAll(0);
+        List<TArrearsDun> list2 = tArrearsDunMapper.selectStatusAll(1);
+        List<TArrearsDun> list3 = tArrearsDunMapper.selectStatusAndAmount(2);
+
+        processList(list, date);
+        processList(list2, date);
+        processList(list3, date);
+
+        LoggerUtils.debug(getClass(), "===========================欠款催款完成==========================");
+    } catch (Exception e) {
+        LoggerUtils.error(getClass(), "===========================欠款催款失败==========================", e);
+    }
+}
 
-			}
-			for (TArrearsDun ta : list3) {
-				TOrderMid tm=tOrderMidMapper.selectByOrderNo(ta.getOrderNo());
-				TOrderNewBo b  = tOrderNewMapper.getSaleIdByOno(ta.getOrderNo());
-				AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId());
-
-				//如果欠款大于0则需要触发邮件
-				if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
-					ta.setDunStatus(3);
-					tArrearsDunMapper.updateByPrimaryKeySelective(ta);
-					ta.setId(null);
-					ta.setDunStatus(1);
-					ta.setStartTime(date);
-					ta.setOrderArrears(tm.getOrderArrears());
-					ta.setOrderReceivables(tm.getOrderReceivables());
-					tArrearsDunMapper.insertSelective(ta);
-					orderNewService.addNotic(NoticeStatus.ORDER_ARREARS_DUN.getCode(),b,null);
-				}else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
-					ta.setDunStatus(2);
-					ta.setOrderReceivables(tm.getOrderReceivables());
-					ta.setOrderArrears(tm.getOrderArrears());
-					tArrearsDunMapper.updateByPrimaryKeySelective(ta);
-				}
-				Thread.sleep(2000);
+private void processList(List<TArrearsDun> tarrearsList, Date date) {
+    for (TArrearsDun ta : tarrearsList) {
+        TOrderMid tm = tOrderMidMapper.selectByOrderNo(ta.getOrderNo());
+        TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(ta.getOrderNo());
+
+        if (b == null || b.getDeleteSign() == null || b.getDeleteSign() == 1) {
+            ta.setDunStatus(3);
+            ta.setEndTime(date);
+            ta.setOrderArrears(tm.getOrderArrears());
+            tArrearsDunMapper.updateByPrimaryKeySelective(ta);
+        } else {
+            BigDecimal arrears = tm.getOrderArrears();
+            if (arrears.compareTo(BigDecimal.ZERO) > 0) {
+                // 欠款大于0则触发邮件并新建记录
+                ta.setDunStatus(3);
+                tArrearsDunMapper.updateByPrimaryKeySelective(ta);
+                ta.setId(null);
+                ta.setDunStatus(1);
+                ta.setStartTime(date);
+                ta.setOrderArrears(arrears);
+                ta.setOrderReceivables(tm.getOrderReceivables());
+                tArrearsDunMapper.insertSelective(ta);
+                orderNewService.addNotic(NoticeStatus.ORDER_ARREARS_DUN.getCode(), b, null);
+            } else if (arrears.compareTo(BigDecimal.ZERO) <= 0) {
+                ta.setDunStatus(2);
+                ta.setOrderArrears(arrears);
+                ta.setOrderReceivables(tm.getOrderReceivables());
+                tArrearsDunMapper.updateByPrimaryKeySelective(ta);
+            }
+        }
+
+        // 若确实需要限流,请使用异步方式替代 Thread.sleep()
+        // Thread.sleep(200); // 建议删除或改为异步处理
+    }
+}
 
-			}
-		} catch (Exception e) {
-			LoggerUtils.error(getClass(), "===========================欠款催款失败==========================", e);
-		}
-	}
 
 //	/**
 //	*	旧催款处理

+ 1 - 0
src/main/java/com/goafanti/common/utils/DateUtils.java

@@ -144,6 +144,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 		calendar.setFirstDayOfWeek(Calendar.SUNDAY);
 		calendar.setTime(date);
 		calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); // Sunday
+		calendar.add(Calendar.DATE, 1);
 		setMidnight(calendar);
 		return calendar.getTime();
 	}

+ 31 - 10
src/main/java/com/goafanti/core/shiro/filter/AdminFilter.java

@@ -1,33 +1,54 @@
 package com.goafanti.core.shiro.filter;
 
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.shiro.web.filter.AccessControlFilter;
-import org.springframework.beans.factory.annotation.Autowired;
-
 import com.goafanti.common.bo.Error;
 import com.goafanti.common.bo.Result;
-import com.goafanti.common.dao.AdminMapper;
 import com.goafanti.common.model.Admin;
 import com.goafanti.common.model.AftUser;
 import com.goafanti.common.utils.LoggerUtils;
+import com.goafanti.common.utils.RedisUtil;
 import com.goafanti.core.shiro.token.TokenManager;
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 public class AdminFilter extends AccessControlFilter {
 	final static Class<AdminFilter>	CLASS	= AdminFilter.class;
 
 	@Autowired
 	private ShiroFilterUtils		shiroFilterUtils;
+	@Autowired
+	private RedisUtil redisUtil;
 
 	@Override
 	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
 			throws Exception {
-
 		AftUser token = TokenManager.getToken();
 		if (token instanceof Admin) {
+			//获取访问是post还是get
+			boolean post = ((HttpServletRequest) request).getMethod().equals("POST");
+			if(post){
+				//获取接口名称
+				String UrlName = ((HttpServletRequest) request).getRequestURI();
+				String id = token.getId();
+				String tokenTime = redisUtil.getString("tokenTime:"+id);
+				if (tokenTime != null){
+				//只限制post请求
+					//判定接口相同时间小于1秒提示请勿重复提交
+					String[] split = tokenTime.split("\\|");
+					String s = split[0];
+					if (UrlName.equals(s)){
+						if (System.currentTimeMillis()-Long.valueOf(split[1])<1000){
+							LoggerUtils.debug(CLASS, "请勿重复提交!");
+							shiroFilterUtils.out((HttpServletResponse) response, new Result().error(new Error("请勿重复提交!")));
+						}
+					}
+				}
+			redisUtil.setString("tokenTime:"+id,UrlName+"|"+System.currentTimeMillis());
+			}
 			return Boolean.TRUE;
 		}
 		return Boolean.FALSE;

+ 8 - 8
src/main/java/com/goafanti/core/shiro/filter/LoginFilter.java

@@ -1,17 +1,16 @@
 package com.goafanti.core.shiro.filter;
 
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.shiro.web.filter.AccessControlFilter;
-import org.springframework.beans.factory.annotation.Autowired;
-
 import com.goafanti.common.bo.Error;
 import com.goafanti.common.bo.Result;
 import com.goafanti.common.utils.LoggerUtils;
 import com.goafanti.core.shiro.token.TokenManager;
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 public class LoginFilter extends AccessControlFilter {
 	final static Class<LoginFilter>	CLASS	= LoginFilter.class;
@@ -19,6 +18,7 @@ public class LoginFilter extends AccessControlFilter {
 	@Autowired
 	private ShiroFilterUtils		shiroFilterUtils;
 
+
 	@Override
 	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
 			throws Exception {

+ 6 - 11
src/main/java/com/goafanti/core/shiro/filter/ShiroFilterUtils.java

@@ -1,17 +1,14 @@
 package com.goafanti.core.shiro.filter;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Value;
-
 import com.alibaba.fastjson.JSON;
-
 import com.goafanti.common.bo.Result;
 import com.goafanti.common.utils.LoggerUtils;
+import org.springframework.beans.factory.annotation.Value;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
 
 public class ShiroFilterUtils {
 	final static Class<? extends ShiroFilterUtils> CLAZZ = ShiroFilterUtils.class;
@@ -44,8 +41,6 @@ public class ShiroFilterUtils {
 	/**
 	 * response 输出JSON
 	 * 
-	 * @param hresponse
-	 * @param resultMap
 	 * @throws IOException
 	 */
 	public void out(HttpServletResponse response, Result res) {

+ 29 - 0
src/main/java/com/goafanti/customer/bo/transferListBo.java

@@ -9,6 +9,35 @@ public class transferListBo {
 	private String pName;
 	private String createDate;
 	private String remarks;
+
+	private String aid;
+	private String uid;
+	private String takeAid;
+
+	public String getAid() {
+		return aid;
+	}
+
+	public void setAid(String aid) {
+		this.aid = aid;
+	}
+
+	public String getUid() {
+		return uid;
+	}
+
+	public void setUid(String uid) {
+		this.uid = uid;
+	}
+
+	public String getTakeAid() {
+		return takeAid;
+	}
+
+	public void setTakeAid(String takeAid) {
+		this.takeAid = takeAid;
+	}
+
 	public Integer getId() {
 		return id;
 	}

+ 45 - 13
src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java

@@ -1,6 +1,7 @@
 package com.goafanti.customer.service.impl;
 
 import com.goafanti.admin.bo.AdminListBo;
+import com.goafanti.admin.bo.AdminPublicReviewerBo;
 import com.goafanti.common.bo.Error;
 import com.goafanti.common.bo.Result;
 import com.goafanti.common.bo.userDaysBo;
@@ -38,6 +39,7 @@ import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 @Service
@@ -114,9 +116,10 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 	private RestrictProjectMapper restrictProjectMapper;
 	@Resource
 	private	AsyncUtils asyncUtils;
-
 	@Resource
 	private UserReceiveLogMapper userReceiveLogMapper;
+	@Resource
+	private AdminPublicReviewerMapper adminPublicReviewerMapper;
 
 
 
@@ -216,7 +219,12 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 				"selectPublicOrganizationCustomerCount", params, pageNo, pageSize);
 		List<CustomerListOut> list = (List<CustomerListOut>) page.getList();
 		list.forEach(e -> {
-			if (e.getAid().equals(TokenManager.getAdminId())){
+			List<transferListBo> transferListBos = userTransferLogMapper.selectByUidGetList(e.getUid());
+			//去重获取aid的List
+			List<String> alist = transferListBos.stream().map(e2 -> e2.getAid()).distinct().collect(Collectors.toList());
+			//判定alist里面是否含有当前用户
+			boolean flag = alist.contains(TokenManager.getAdminId());
+			if (flag){
 				e.setMyUser(1);
 			}
 		});
@@ -260,9 +268,16 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 		for (CustomerListOut c : l) {
 			if (null != c) {
 				if (null != c.getAid()) c.setAdminName(adminMapper.selectNameByid(c.getAid()));
-				if (c.getAid().equals(TokenManager.getAdminId())) c.setMyUser(1);
 				if (null != c.getShareType() && c.getShareType().equals("1")) c.setAdminName("暂无");
 				if (null != c.getMid()) c.setInformationMaintainer(adminMapper.selectNameByid(c.getMid()));
+				List<transferListBo> transferListBos = userTransferLogMapper.selectByUidGetList(c.getUid());
+				//去重获取aid的List
+				List<String> alist = transferListBos.stream().map(e2 -> e2.getAid()).distinct().collect(Collectors.toList());
+				//判定alist里面是否含有当前用户
+				boolean flag = alist.contains(TokenManager.getAdminId());
+				if (flag){
+					c.setMyUser(1);
+				}
 			}
 		}
 		return p;
@@ -1419,8 +1434,7 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 		StringBuffer content=null;
 		String noticeAid=null;
 		for (PublicReleaseTransferUserBo e : list) {
-			PublicExamine pe=new PublicExamine();
-			pe.setPrid(e.getId());
+			List<PublicExamine> pes=new ArrayList<>();
 			if (e.getAid().equals(aid)){
 				content=new StringBuffer().append("[").append(e.getUserNames()).append("]公司的外出申请已发起,请尽快审核。");
 				//再查比对和发起者一致的全部走入下一个审核流程
@@ -1428,15 +1442,28 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 				pr.setId(e.getId());
 				pr.setPublicType(0);
 				publicReleaseMapper.update(pr);
-				Admin sendAdmin=adminMapper.selectById(admin.getReviewer());
-				noticeAid=sendAdmin.getId();
-				logStatus=2;
-				logMsg="转交客户到发起公出审核人,自动审核通过。";
-				pe.setAid(sendAdmin.getId());
-				pe.setAname(sendAdmin.getName());
-				pe.setCreateTime(new Date());
+				List<AdminPublicReviewerBo> adminPublicReviewerBos = adminPublicReviewerMapper.selectByAid(admin.getId());
+				//提取type=0的数据
+					Admin sendAdmin=adminMapper.selectById(admin.getReviewer());
+//				noticeAid=sendAdmin.getId();
+				List<AdminPublicReviewerBo> adminPublicReviewerBos0 = adminPublicReviewerBos.stream().filter(e1 -> e1.getType().equals(0)).collect(Collectors.toList());
+				//又
+				if (adminPublicReviewerBos0.size()>0){
+					for (AdminPublicReviewerBo e2 : adminPublicReviewerBos0) {
+						logStatus=2;
+						logMsg="转交客户到发起公出审核人,自动审核通过。";
+						PublicExamine pe=new PublicExamine();
+						pe.setPrid(e.getId());
+						pe.setAid(e2.getReviewerId());
+						pe.setAname(e2.getReviewerName());
+						pe.setCreateTime(new Date());
+						pes.add(pe);
+					}
+				}
 			}else {
 				//与发起者不一致的就需要修改审核人员
+				PublicExamine pe=new PublicExamine();
+				pe.setPrid(e.getId());
 				pe.setAid(aid);
 				pe.setAname(admin.getName());
 				//给新的审核人发送消息
@@ -1444,6 +1471,7 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 				logMsg="转交客户归属人到["+admin.getName()+"]。";
 				content=new StringBuffer().append("[").append(e.getUserNames()).append("]公司已转交给您,相关公出请尽快审核。");
 				noticeAid=aid;
+				pes.add(pe);
 			}
 			PublicReleaseLog log = new PublicReleaseLog(e.getId(), TokenManager.getAdminId(), logStatus, logMsg, new Date());
 			publicReleaseLogMapper.insertSelective(log);
@@ -1455,7 +1483,11 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 			n.setContent(content.toString());
 			n.setReaded(0);//未读
 			asyncUtils.addNotice(n);
-			publicExamineMapper.updateByPridSelective(pe);
+			if (pes.size()>0){
+				for (PublicExamine pe : pes) {
+					publicExamineMapper.updateByPridSelective(pe);
+				}
+			}
 		}
 	}
 

+ 1 - 2
src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseCountsServiceImpl.java

@@ -53,7 +53,7 @@ public class ExpenseCountsServiceImpl implements ExpenseCountsService {
                         }
 
                     }
-                    if(useOyd.getStatus()==1){
+                    if(useOyd !=null&&useOyd.getStatus()==1){
                         e.setMaxDuration("不限制");
                         e.setExceedDuration("0");
                     }else {
@@ -65,7 +65,6 @@ public class ExpenseCountsServiceImpl implements ExpenseCountsService {
                         }
                     }
                 }
-
             });
             return expenseCountsBos;
         }else {

+ 2 - 0
src/main/java/com/goafanti/order/controller/AdminNewOrderApiController.java

@@ -254,6 +254,8 @@ public class AdminNewOrderApiController extends CertifyApiController {
 		res.setData(orderNewService.getOrderNewDetail(orderNo));
 		return res;
 	}
+
+
 	/**
 	 * 订单审核列表
 	 * @param orderNo

+ 2 - 1
src/main/java/com/goafanti/order/controller/OrderChangeApiController.java

@@ -538,7 +538,8 @@ public class OrderChangeApiController extends CertifyApiController {
 	 * 变更-新增会员子项目
 	 *
 	 */
-	@RequestMapping(value = "/addMemberSonProject" ,method = RequestMethod.POST)
+	@RequestMapping(value = "" +
+			"/addMemberSonProject" ,method = RequestMethod.POST)
 	public Result addMemberSonProject(InputAddSonProject in ){
 		Result res = new Result();
 		if(in.getId()==null||StringUtils.isBlank(in.getServiceYear())){

+ 8 - 2
src/main/java/com/goafanti/order/service/impl/OrderChangeServiceImpl.java

@@ -1424,8 +1424,9 @@ public class OrderChangeServiceImpl extends BaseMybatisDao<NewOrderChangeMapper>
 								addSonProject(t2);
 							}
 						}
+				}else if(bp.getProjectType().equals(NewProjectTypeEnum.SIMPLE.getCode())||bp.getProjectType().equals(NewProjectTypeEnum.UNILATERAL.getCode())){
+					addSonProject(t);
 				}
-
 				return t;
 			}
 
@@ -1450,7 +1451,12 @@ public class OrderChangeServiceImpl extends BaseMybatisDao<NewOrderChangeMapper>
 	}
 
 	private void pushSuerProject( InputTChangeTaskBo tChangeTask) {
-		List<TChangeTask> tChangeTasks = tChangeTaskMapper.selectBySuper(null, tChangeTask.getId(), tChangeTask.getCid());
+		List<TChangeTask> tChangeTasks;
+		if (tChangeTask.getTid()==null){
+			 tChangeTasks = tChangeTaskMapper.selectBySuper(null, tChangeTask.getId(), tChangeTask.getCid());
+		}else{
+			tChangeTasks = tChangeTaskMapper.selectBySuper(tChangeTask.getTid(), null, tChangeTask.getCid());
+		}
 		if (!tChangeTasks.isEmpty()){
 			int a=0,b=0,c=0;
 			StringBuilder str= new StringBuilder();

+ 2 - 1
src/main/java/com/goafanti/order/service/impl/PushOrderService.java

@@ -34,7 +34,8 @@ public class PushOrderService {
     public String processStatusConstant(TOrderNewBo t){
         //tOrder.getContractPictureUrl(),tOrder.getSalesmanId(),tOrder.getProcessStatus(),tOrder.getApproval()
         //流程状态 0-已派营销员,1-已派营销员管理员,2-已派财务管理员,3-已派财务专员,4-已派咨询师管理员,5-已部分派咨询师经理,6-已部全部派咨询师经理
-        if (TokenManager.hasRole(AFTConstants.SUPERADMIN) || TokenManager.hasRole(AFTConstants.APPROVAL_DECISION) ){
+        if (TokenManager.hasRole(AFTConstants.SUPERADMIN) || TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)
+        ||TokenManager.hasRole(AFTConstants.APPROVAL_DECISION_ASSISTANT) ){
             return t.getContractPictureUrl();
         }else if ((TokenManager.hasRole(AFTConstants.SALESMAN_MANAGER)||TokenManager.hasRole(AFTConstants.SALESMAN)
                 ||TokenManager.hasRole(AFTConstants.SALESMAN_ASSISTANT))&&

+ 3 - 1
src/main/java/com/goafanti/permission/service/impl/NewRoleServiceImpl.java

@@ -55,6 +55,8 @@ public class NewRoleServiceImpl extends BaseMybatisDao<RoleMapper> implements Ne
 	private AsyncUtils asyncUtils;
 	@Autowired
 	private DepartmentMapper departmentMapper;
+	@Autowired
+	private UserLockReleaseMapper userLockReleaseMapper;
 
 
 	@Override
@@ -176,7 +178,7 @@ public class NewRoleServiceImpl extends BaseMybatisDao<RoleMapper> implements Ne
 				organizationContactBookMapper.updateDimissionTransfer(aid,transferId);
 				//所有客户转交给接受者
 				transferUserUpdateExamine(aid,transferId);
-				userMapper.updateDimissionTransfer(aid,transferId);
+				userMapper.updateDimissionTransfer(aid,transferId,date);
 			}else if (s==roleResources.QDYW.getCode()) {
 				userTransferLogMapper.insertUserLockLog(aid,transferId,date);
 				patentNewMapper.updateAdmin(aid,transferId);

+ 9 - 0
src/main/java/com/goafanti/weChat/bo/OutPublicReleaseList.java

@@ -8,6 +8,7 @@ public class OutPublicReleaseList {
 	private Integer id;
 	private String nickname;
 	private String orderNo;
+	private String contractNo;
 	private String districtName;
 	private String aid;
 	private String aname;
@@ -43,6 +44,14 @@ public class OutPublicReleaseList {
 	private Integer assistProcess;
 	private Integer alone;
 
+	public String getContractNo() {
+		return contractNo;
+	}
+
+	public void setContractNo(String contractNo) {
+		this.contractNo = contractNo;
+	}
+
 	public Integer getMaxProcess() {
 		return maxProcess;
 	}

+ 2 - 1
src/main/java/com/goafanti/weChat/service/impl/PublicReleaseServiceImpl.java

@@ -1700,7 +1700,8 @@ public class PublicReleaseServiceImpl extends BaseMybatisDao<PublicReleaseMapper
 		List<PublicRelease> newList = publicReleaseMapper.selectByMainId(use.getId(),3,null);
 		int count = 0;
 		for (PublicRelease e : newList) {
-			if (e.getStatus()==2){
+			//如果是完成或者拒绝则标记,全中断则修改状态
+			if (e.getStatus()==2||e.getStatus()==3){
 				count++;
 			}
 		}

+ 128 - 0
src/main/java/com/tencent/wework/Finance.java

@@ -0,0 +1,128 @@
+package com.tencent.wework;
+
+/* sdk返回数据
+typedef struct Slice_t {
+    char* buf;
+    int len;
+} Slice_t;
+
+typedef struct MediaData {
+    char* outindexbuf;
+    int out_len;
+    char* data;
+    int data_len;
+    int is_finish;
+} MediaData_t;
+*/
+
+public class Finance {
+    public native static long NewSdk();
+
+    /**
+     * 初始化函数
+     * Return值=0表示该API调用成功
+     *
+     * @param [in] sdk			NewSdk返回的sdk指针
+     * @param [in] corpid      调用企业的企业id,例如:wwd08c8exxxx5ab44d,可以在企业微信管理端--我的企业--企业信息查看
+     * @param [in] secret		聊天内容存档的Secret,可以在企业微信管理端--管理工具--聊天内容存档查看
+     * @return 返回是否初始化成功
+     * 0   - 成功
+     * !=0 - 失败
+     */
+    public native static int Init(long sdk, String corpid, String secret);
+
+    /**
+     * 拉取聊天记录函数
+     * Return值=0表示该API调用成功
+     *
+     * @param [in]  sdk				NewSdk返回的sdk指针
+     * @param [in]  seq				从指定的seq开始拉取消息,注意的是返回的消息从seq+1开始返回,seq为之前接口返回的最大seq值。首次使用请使用seq:0
+     * @param [in]  limit			一次拉取的消息条数,最大值1000条,超过1000条会返回错误
+     * @param [in]  proxy			使用代理的请求,需要传入代理的链接。如:socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
+     * @param [in]  passwd			代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
+     * @param [out] chatDatas		返回本次拉取消息的数据,slice结构体.内容包括errcode/errmsg,以及每条消息内容。
+     * @return 返回是否调用成功
+     * 0   - 成功
+     * !=0 - 失败
+     */
+    public native static int GetChatData(long sdk, long seq, long limit, String proxy, String passwd, long timeout, long chatData);
+
+    /**
+     * 拉取媒体消息函数
+     * Return值=0表示该API调用成功
+     *
+     * @param [in]  sdk				NewSdk返回的sdk指针
+     * @param [in]  sdkFileid		从GetChatData返回的聊天消息中,媒体消息包括的sdkfileid
+     * @param [in]  proxy			使用代理的请求,需要传入代理的链接。如:socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
+     * @param [in]  passwd			代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
+     * @param [in]  indexbuf		媒体消息分片拉取,需要填入每次拉取的索引信息。首次不需要填写,默认拉取512k,后续每次调用只需要将上次调用返回的outindexbuf填入即可。
+     * @param [out] media_data		返回本次拉取的媒体数据.MediaData结构体.内容包括data(数据内容)/outindexbuf(下次索引)/is_finish(拉取完成标记)
+     * @return 返回是否调用成功
+     * 0   - 成功
+     * !=0 - 失败
+     */
+    public native static int GetMediaData(long sdk, String indexbuf, String sdkField, String proxy, String passwd, long timeout, long mediaData);
+
+    /**
+     * @param [in]  encrypt_key, getchatdata返回的encrypt_key
+     * @param [in]  encrypt_msg, getchatdata返回的content
+     * @param [out] msg, 解密的消息明文
+     * @return 返回是否调用成功
+     * 0   - 成功
+     * !=0 - 失败
+     * @brief 解析密文
+     */
+    public native static int DecryptData(long sdk, String encrypt_key, String encrypt_msg, long msg);
+
+    public native static void DestroySdk(long sdk);
+
+    public native static long NewSlice();
+
+    /**
+     * @return
+     * @brief 释放slice,和NewSlice成对使用
+     */
+    public native static void FreeSlice(long slice);
+
+    /**
+     * @return 内容
+     * @brief 获取slice内容
+     */
+    public native static String GetContentFromSlice(long slice);
+
+    /**
+     * @return 内容
+     * @brief 获取slice内容长度
+     */
+    public native static int GetSliceLen(long slice);
+
+    public native static long NewMediaData();
+
+    public native static void FreeMediaData(long mediaData);
+
+    /**
+     * @return outindex
+     * @brief 获取mediadata outindex
+     */
+    public native static String GetOutIndexBuf(long mediaData);
+
+    /**
+     * @return data
+     * @brief 获取mediadata data数据
+     */
+    public native static byte[] GetData(long mediaData);
+
+    public native static int GetIndexLen(long mediaData);
+
+    public native static int GetDataLen(long mediaData);
+
+    /**
+     * @return 1完成、0未完成
+     * @brief 判断mediadata是否结束
+     */
+    public native static int IsMediaDataFinish(long mediaData);
+
+    static {
+        System.loadLibrary("WeWorkFinanceSdk");
+    }
+}

+ 2 - 1
src/main/resources/props/config_local.properties

@@ -1,6 +1,7 @@
 dev.name=local
+spring.main.lazy-initialization=true
 jdbc.driverClassName=com.mysql.jdbc.Driver
-kede.version=1.3.43
+kede.version=1.3.44
 static.host=//static.jishutao.com/${kede.version}
 #static.host=//172.16.1.199:3000/${kede.version}
 #static.host=//172.16.1.187/${kede.version}

+ 1 - 1
src/main/resources/props/config_test.properties

@@ -1,5 +1,5 @@
 dev.name=test
-static.host=//static.jishutao.com/1.3.43
+static.host=//static.jishutao.com/1.3.44
 #Driver
 jdbc.driverClassName=com.mysql.jdbc.Driver
 jdbc.url=jdbc:mysql://127.0.0.1:3306/aft?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false