Browse Source

分配用户信息 安经销商发送通知

qxp 4 years ago
parent
commit
d09ab09c33
25 changed files with 778 additions and 74 deletions
  1. 30 1
      suishenbang-admin/src/main/java/com/dgtly/web/controller/system/SysUserController.java
  2. 1 1
      suishenbang-admin/src/main/resources/application-uat.yml
  3. 1 1
      suishenbang-admin/src/main/resources/logback.xml
  4. 3 1
      suishenbang-admin/src/main/resources/static/ruoyi/js/ry-ui.js
  5. 1 1
      suishenbang-admin/src/main/resources/templates/system/dept/dept.html
  6. 171 5
      suishenbang-admin/src/main/resources/templates/system/user/add.html
  7. 173 3
      suishenbang-admin/src/main/resources/templates/system/user/edit.html
  8. 141 0
      suishenbang-admin/src/main/resources/templates/system/user/selectUser.html
  9. 2 0
      suishenbang-api/src/main/java/com/dgtly/ApiApplication.java
  10. 1 1
      suishenbang-api/src/main/resources/application.yml
  11. 1 1
      suishenbang-api/src/main/resources/logback.xml
  12. 13 0
      suishenbang-common/src/main/java/com/dgtly/common/core/domain/ParameterObject.java
  13. 32 0
      suishenbang-common/src/main/java/com/dgtly/common/utils/http/HttpUtils.java
  14. 9 0
      suishenbang-system/src/main/java/com/dgtly/system/domain/SysUserExt.java
  15. 11 0
      suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserMapper.java
  16. 7 0
      suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserExtService.java
  17. 9 0
      suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserService.java
  18. 10 0
      suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserExtServiceImpl.java
  19. 14 0
      suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserServiceImpl.java
  20. 11 0
      suishenbang-system/src/main/resources/mapper/system/SysUserMapper.xml
  21. 1 1
      suishenbang-system/src/main/resources/mapper/system/SysUserSalesExtMapper.xml
  22. 77 55
      suishenbang-wxportal/suishenbang-wxportal-api/src/main/java/com/dgtly/wxportal/controller/WxController.java
  23. 3 1
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxAccessTokenUtil.java
  24. 46 0
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxSendMessageUtil.java
  25. 10 2
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxUserUtil.java

+ 30 - 1
suishenbang-admin/src/main/java/com/dgtly/web/controller/system/SysUserController.java

@@ -10,6 +10,7 @@ import com.dgtly.common.utils.ShiroSaltUtil;
 import com.dgtly.common.utils.security.EncryptPassWordClass;
 import com.dgtly.system.domain.SysCompany;
 import com.dgtly.system.domain.SysDept;
+import com.dgtly.system.domain.SysUserExt;
 import com.dgtly.system.service.*;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,7 +48,8 @@ public class SysUserController extends BaseController
 
     @Autowired
     private ISysUserService userService;
-
+    @Autowired
+    private ISysUserExtService userExtService;
     @Autowired
     private ISysRoleService roleService;
 
@@ -67,6 +69,12 @@ public class SysUserController extends BaseController
         return prefix + "/user";
     }
 
+    @GetMapping("/selectUser")
+    public String selectUser()
+    {
+        return prefix + "/selectUser";
+    }
+
     @RequiresPermissions("system:user:list")
     @PostMapping("/list")
     @ResponseBody
@@ -157,7 +165,12 @@ public class SysUserController extends BaseController
         user.setPassword(EncryptPassWordClass.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
         user.setCreateBy(ShiroUtils.getLoginName());
         int userId = userService.insertUser(user);
+        if(user.getSysUserExt()!=null){
+            SysUserExt ext =user.getSysUserExt();
+            ext.setUserId(user.getUserId());
+            userExtService.insertOrUpSysUserExt(ext);
 
+        }
 
         return toAjax(userId);
     }
@@ -196,6 +209,12 @@ public class SysUserController extends BaseController
             return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
         }
         user.setUpdateBy(ShiroUtils.getLoginName());
+        if(user.getSysUserExt().getIsChangeExt()>0){
+            SysUserExt ext =user.getSysUserExt();
+            ext.setUserId(user.getUserId());
+            userExtService.insertOrUpSysUserExt(ext);
+        }
+
         int rows = userService.updateUser(user);
 
         return toAjax(rows);
@@ -298,4 +317,14 @@ public class SysUserController extends BaseController
 
         return toAjax(userService.changeStatus(user));
     }
+
+
+    @GetMapping("/getExt/{userId}")
+    @ResponseBody
+    public Object resetPwdSave(@PathVariable("userId") Long userId)
+    {
+        SysUserExt sysUserExt =  userExtService.selectSysUserExtById(userId);
+
+        return AjaxResult.success(sysUserExt);
+    }
 }

+ 1 - 1
suishenbang-admin/src/main/resources/application-uat.yml

@@ -12,7 +12,7 @@ ruoyi:
   profile: /home/admin/project/file
   # 获取ip地址开关
   addressEnabled: false
-  cloudPath: http://suishenbangtest.nipponpaint.com.cn/gateway/
+  cloudPath: http://suishenbang.nipponpaint.com.cn/gateway/
 #经销商微信接口相关配置
 customer:
   appid: ap4f8e6a38b6142187

+ 1 - 1
suishenbang-admin/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/suishenbang/logs" />
+	<property name="log.path" value="/home/admin/project/logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 

+ 3 - 1
suishenbang-admin/src/main/resources/static/ruoyi/js/ry-ui.js

@@ -38,6 +38,7 @@
                     mobileResponsive: true,
                     rememberSelected: false,
         		    fixedColumns: false,
+                    singleSelect:false,
         		    fixedNumber: 0,
         		    rightFixedColumns: false,
         		    rightFixedNumber: 0,
@@ -54,7 +55,8 @@
                     method: 'post',                                     // 请求方式(*)
                     cache: false,                                       // 是否使用缓存
                     height: options.height,                             // 表格的高度
-                    striped: options.striped,                           // 是否显示行间隔色
+                    striped: options.striped, 							// 是否显示行间隔色
+                    singleSelect:options.singleSelect,                  // 是否多行选择
                     sortable: true,                                     // 是否启用排序
                     sortStable: true,                                   // 设置为 true 将获得稳定的排序
                     sortName: options.sortName,                         // 排序列名称

+ 1 - 1
suishenbang-admin/src/main/resources/templates/system/dept/dept.html

@@ -111,7 +111,7 @@
 		function deptAddModel(){
 		    var deptId = [[${user.deptId}]];
 		    if(deptId==null||deptId==0){
-                deptId = 100;
+                deptId = 1;
 			}
             $.operate.add(deptId);
 		}

+ 171 - 5
suishenbang-admin/src/main/resources/templates/system/user/add.html

@@ -113,13 +113,105 @@
                     </div>
                 </div>
             </div>
+            <h4 class="form-header h4" style="line-height: 2.1;">扩展信息
+                <div style="float: right">
+                    <!--<button type="button" class="btn btn-sm btn-primary" onclick="editExt()"><i class="fa fa-check"></i>自定义</button>&nbsp;-->
+                    <button type="button" class="btn btn-sm btn-primary" onclick="selectExt()"><i class="fa fa-check"></i>选择扩展信息</button>&nbsp;
+                </div>
+            </h4>
+
+            <input  type="hidden" readonly="true" name="sysUserExt.isChangeExt" />
+            <div class="row">
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">用户类别:</label>
+                        <input type="hidden" name="sysUserExt.salesLevel" onchange="changeLevelText">
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" id="salesText" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">岗位名称:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" name="sysUserExt.postName" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">组织Code:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" name="sysUserExt.orgCode" />
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="salesDiv">
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">岗位Code:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" name="sysUserExt.postCode"/>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">组织名称:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" name="sysUserExt.orgName" />
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">领导名称:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" name="sysUserExt.bossName"/>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">领导id:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" name="sysUserExt.bossEmployeeId"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+            <div class="row" id="customerDiv">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">经销商Code:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" name="sysUserExt.customerCode" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">是否是经理:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" name="sysUserExt.isCustomerManager" />
+                        </div>
+                    </div>
+                </div>
+            </div>
             <h4 class="form-header h4">其他信息</h4>
             <div class="row">
                 <div class="col-sm-12">
                     <div class="form-group">
                         <label class="col-xs-2 control-label">备注:</label>
                         <div class="col-xs-10">
-                            <textarea name="remark" maxlength="500" class="form-control" rows="3"></textarea>
+                            <textarea name="remark" maxlength="500" class="form-control" rows="3">[[*{remark}]]</textarea>
                         </div>
                     </div>
                 </div>
@@ -135,9 +227,9 @@
     </div>
 	<th:block th:include="include :: footer" />
 	<th:block th:include="include :: select2-js" />
-	<script>
+	<script  th:inline="javascript">
 	    var prefix = ctx + "system/user";
-	
+        var salesLevelDict = [[${@dict.getType('sales_level')}]];//销售人员等级
         $("#form-user-add").validate({
         	onkeyup: false,
         	rules:{
@@ -225,7 +317,7 @@
         /*用户管理-新增-选择部门树*/
         function selectDeptTree() {
         	var treeId = $("#treeId").val();
-        	var deptId = $.common.isEmpty(treeId) ? "99000000" : $("#treeId").val();
+        	var deptId = $.common.isEmpty(treeId) ? "1" : $("#treeId").val();
         	var url = ctx + "system/dept/selectDeptTree/" + deptId;
 			var options = {
 				title: '选择部门',
@@ -244,7 +336,81 @@
     			$("#treeName").val(body.find('#treeName').val());
     			layer.close(index);
 			}
-		}
+		}function changeLevel(){
+            var level = $("input[name='sysUserExt.salesLevel']").val();
+            if(level=="customer_level"){
+                $("#customerDiv").show();
+                $("#salesDiv").hide();
+            }else if(level=="diy_level"){
+
+                $("#customerDiv").show();
+                $("#salesDiv").show();
+            }else{
+                $("#customerDiv").hide();
+                $("#salesDiv").show();
+            }
+
+
+        }
+
+        /*用户管理-修改-选择其他用户扩展信息*/
+        function selectExt() {
+            var url = ctx + "system/user/selectUser/";
+            var options = {
+                title: '选择部门',
+                url: url,
+                callBack: doExtSubmit
+            };
+            $.modal.openOptions(options);
+
+        }
+
+        function doExtSubmit(index, layero){
+            var body = layer.getChildFrame('body', index);
+            var userId = body.find('#selectUserId').val();
+            if(userId==null||userId==""){
+                alert("请选择一个用户!");
+                return;
+            }
+            $.ajax({
+                url: ctx + "/system/user/getExt/"+userId,
+                type: "GET",
+                success: function(result) {
+                    if(result.code==0){
+                        $("input[name='sysUserExt.salesLevel']").val(result.data.salesLevel);
+
+                        changeLevelText();
+                        changeLevel();
+                        $("input[name='sysUserExt.postName']").val(result.data.postName);
+                        $("input[name='sysUserExt.orgCode']").val(result.data.orgCode);
+                        $("input[name='sysUserExt.postCode']").val(result.data.postCode);
+                        $("input[name='sysUserExt.orgName']").val(result.data.orgName);
+                        $("input[name='sysUserExt.bossName']").val(result.data.bossName);
+                        $("input[name='sysUserExt.bossEmployeeId']").val(result.data.bossEmployeeId);
+                        $("input[name='sysUserExt.customerCode']").val(result.data.customerCode);
+                        $("input[name='sysUserExt.isCustomerManager']").val(result.data.isCustomerManager);
+
+
+                    }else{
+                        $.modal.alertWarning(result.msg);
+                    }
+
+                }
+            })
+            layer.close(index);
+        }
+        function changeLevelText(){
+            var v = $("input[name='sysUserExt.salesLevel']").val();
+            console.log(salesLevelDict);
+            for(var i =0;i<salesLevelDict.length;i++){
+                if(salesLevelDict[i].dictValue==v){
+
+                    $("#salesText").val(salesLevelDict[i].dictLabel);
+                    break;
+                }
+
+            }
+        }
 
 		$(function() {
             $('#post').select2({

+ 173 - 3
suishenbang-admin/src/main/resources/templates/system/user/edit.html

@@ -104,6 +104,98 @@
                     </div>
                 </div>
             </div>
+            <h4 class="form-header h4" style="line-height: 2.1;">扩展信息
+                <div style="float: right">
+                    <!--<button type="button" class="btn btn-sm btn-primary" onclick="editExt()"><i class="fa fa-check"></i>自定义</button>&nbsp;-->
+                    <button type="button" class="btn btn-sm btn-primary" onclick="selectExt()"><i class="fa fa-check"></i>选择扩展信息</button>&nbsp;
+                </div>
+            </h4>
+
+            <input  type="hidden" readonly="true" th:field="*{sysUserExt.isChangeExt}" />
+            <div class="row">
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">用户类别:</label>
+                        <input type="hidden" th:field="*{sysUserExt.salesLevel}" onchange="changeLevelText">
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" id="salesText" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">岗位名称:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.postName}" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-4">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">组织Code:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.orgCode}" />
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="salesDiv">
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">岗位Code:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.postCode}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">组织名称:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.orgName}" />
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">领导名称:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.bossName}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group">
+                            <label class="col-sm-4 control-label">领导id:</label>
+                            <div class="col-sm-8">
+                                <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.bossEmployeeId}"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+            <div class="row" id="customerDiv">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">经销商Code:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.customerCode}" />
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">是否是经理:</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" type="text" readonly="true" th:field="*{sysUserExt.isCustomerManager}" />
+                        </div>
+                    </div>
+                </div>
+            </div>
             <h4 class="form-header h4">其他信息</h4>
             <div class="row">
                 <div class="col-sm-12">
@@ -125,9 +217,9 @@
     </div>
 	<th:block th:include="include :: footer" />
 	<th:block th:include="include :: select2-js" />
-	<script type="text/javascript">
+	<script th:inline="javascript">
         var prefix = ctx + "system/user";
-        
+        var salesLevelDict = [[${@dict.getType('sales_level')}]];//销售人员等级
         $("#form-user-edit").validate({
         	onkeyup: false,
         	rules:{
@@ -180,7 +272,8 @@
             },
             focusCleanup: true
         });
-        
+        changeLevel();
+        changeLevelText();
         function submitHandler() {
 	        if ($.validate.form()) {
 	        	var data = $("#form-user-edit").serializeArray();
@@ -216,6 +309,83 @@
     			layer.close(index);
 			}
 		}
+		function changeLevel(){
+            var level = $("input[name='sysUserExt.salesLevel']").val();
+            if(level=="customer_level"){
+                $("#customerDiv").show();
+                $("#salesDiv").hide();
+            }else if(level=="diy_level"){
+
+                $("#customerDiv").show();
+                $("#salesDiv").show();
+            }else{
+                $("#customerDiv").hide();
+                $("#salesDiv").show();
+            }
+
+
+        }
+
+        /*用户管理-修改-选择其他用户扩展信息*/
+        function selectExt() {
+            var url = ctx + "system/user/selectUser/";
+            var options = {
+                title: '选择部门',
+                url: url,
+                callBack: doExtSubmit
+            };
+            $.modal.openOptions(options);
+
+        }
+
+        function doExtSubmit(index, layero){
+        var body = layer.getChildFrame('body', index);
+            var userId = body.find('#selectUserId').val();
+            if(userId==null||userId==""){
+                alert("请选择一个用户!");
+                return;
+            }
+            $.ajax({
+                url: ctx + "/system/user/getExt/"+userId,
+                type: "GET",
+                success: function(result) {
+                    if(result.code==0){
+                        $("input[name='sysUserExt.salesLevel']").val(result.data.salesLevel);
+
+                        changeLevelText();
+                        changeLevel();
+                        $("input[name='sysUserExt.postName']").val(result.data.postName);
+                        $("input[name='sysUserExt.orgCode']").val(result.data.orgCode);
+                        $("input[name='sysUserExt.postCode']").val(result.data.postCode);
+                        $("input[name='sysUserExt.orgName']").val(result.data.orgName);
+                        $("input[name='sysUserExt.bossName']").val(result.data.bossName);
+                        $("input[name='sysUserExt.bossEmployeeId']").val(result.data.bossEmployeeId);
+                        $("input[name='sysUserExt.customerCode']").val(result.data.customerCode);
+                        $("input[name='sysUserExt.isCustomerManager']").val(result.data.isCustomerManager);
+
+                        $("input[name='sysUserExt.isChangeExt']").val(1);
+
+                    }else{
+                        $.modal.alertWarning(result.msg);
+                    }
+
+                }
+            })
+                layer.close(index);
+        }
+
+        function changeLevelText(){
+           var v = $("input[name='sysUserExt.salesLevel']").val();
+            console.log(salesLevelDict);
+            for(var i =0;i<salesLevelDict.length;i++){
+                if(salesLevelDict[i].dictValue==v){
+
+                    $("#salesText").val(salesLevelDict[i].dictLabel);
+                    break;
+                }
+
+            }
+        }
 
 		$(function() {
             $('#post').select2({

+ 141 - 0
suishenbang-admin/src/main/resources/templates/system/user/selectUser.html

@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('用户列表')" />
+	<th:block th:include="include :: layout-latest-css" />
+	<th:block th:include="include :: ztree-css" />
+</head>
+<body class="gray-bg">
+	<div class="ui-layout-center">
+		<div class="container-div">
+			<div class="row">
+				<div class="col-sm-12 search-collapse">
+					<form id="user-form">
+						<input type="hidden" id="deptId" name="deptId">
+		                <input type="hidden" id="parentId" name="parentId">
+						<div class="select-list">
+							<ul>
+								<li>
+									登录名称:<input type="text" name="loginName"/>
+								</li>
+								<li>
+									用户名称:<input type="text" name="userName"/>
+								</li>
+								<li>
+									手机号码:<input type="text" name="phonenumber"/>
+								</li>
+								<li>
+									用户状态:<select name="status" th:with="type=${@dict.getType('sys_normal_disable')}">
+										<option value="">所有</option>
+										<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+									</select>
+								</li>
+                                <li>
+                                    用户级别:<select name="sysUserExt.salesLevel" th:with="type=${@dict.getType('sales_level')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                                </li>
+								<li class="select-time">
+									<label>创建时间: </label>
+									<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
+									<span>-</span>
+									<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
+								</li>
+								<li>
+									<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+								    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+								</li>
+							</ul>
+						</div>
+					</form>
+				</div>
+		        
+		        <div class="col-sm-12 select-table table-striped">
+				    <table id="bootstrap-table"></table>
+				</div>
+
+				<input id="selectUserId" type="hidden">
+			</div>
+		</div>
+	</div>
+	
+	<th:block th:include="include :: footer" />
+	<th:block th:include="include :: layout-latest-js" />
+	<th:block th:include="include :: ztree-js" />
+
+	<script th:inline="javascript">
+
+        var salesLevelDict = [[${@dict.getType('sales_level')}]];//销售人员等级
+		var prefix = ctx + "system/user";
+
+		$(function() {
+		    queryUserList();
+
+		});
+
+		function queryUserList() {
+		    var options = {
+		        url: prefix + "/list",
+		        sortName: "createTime",
+		        sortOrder: "desc",
+		        modalName: "用户",
+                clickToSelect: true,
+                singleSelect:true,
+                onClickRow:function (row,$element) {
+                    $("#selectUserId").val(row.userId);
+                },
+		        columns: [{
+		            checkbox: true
+		        },
+				{
+					field: 'userId',
+					visible:false,
+				},
+		        {
+		            field: 'loginName',
+		            title: '登录名称',
+		            sortable: true
+		        },
+		        {
+		            field: 'userName',
+		            title: '用户名称'
+		        },
+		        {
+		            field: 'dept.deptName',
+		            title: '部门'
+		        },
+		        {
+		            field: 'email',
+		            title: '邮箱',
+		            visible: false
+		        },
+		        {
+		            field: 'phonenumber',
+		            title: '手机'
+		        },
+		         {
+		             field: 'sysUserExt.salesLevel',
+		             title: '销售人员等级',
+                     formatter: function(value, row, index) {
+                         return $.table.selectDictLabel(salesLevelDict, value);
+                     }
+		         },
+                {
+                    field: 'sysUserExt.orgName',
+                    title: '组织名称'
+                },
+                {
+                    field: 'sysUserExt.orgCode',
+                    title: '组织code'
+                }]
+		    };
+		    $.table.init(options);
+		}
+
+
+
+	</script>
+</body>
+
+</html>

+ 2 - 0
suishenbang-api/src/main/java/com/dgtly/ApiApplication.java

@@ -3,10 +3,12 @@ package com.dgtly;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @EnableSwagger2
+@EnableAsync
 public class ApiApplication {
 
 

+ 1 - 1
suishenbang-api/src/main/resources/application.yml

@@ -1,4 +1,4 @@
 spring:
   profiles:
-    active: uat
+    active: dev
 #开发环境dev 测试环境test 正式环境prod  启动时可以设置参数Java -jar xxxxxx.jar spring.profiles.actiove=prod

+ 1 - 1
suishenbang-api/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/suishenbang/logs" />
+	<property name="log.path" value="/home/admin/project/logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 

+ 13 - 0
suishenbang-common/src/main/java/com/dgtly/common/core/domain/ParameterObject.java

@@ -30,6 +30,8 @@ public class ParameterObject {
         }
     }
 
+
+
     public JSONObject getJSONObject(String key){
         if(jsonObject!=null){
             return jsonObject.getJSONObject(key);
@@ -45,6 +47,8 @@ public class ParameterObject {
         }
     }
 
+
+
     public String getString(String key){
         if(jsonObject!=null){
             return jsonObject.getString(key);
@@ -81,6 +85,15 @@ public class ParameterObject {
         }
     }
 
+    public <T> List<T> getList(String key,Class<T> clazz){
+        if(jsonObject!=null){
+            return jsonObject.getJSONArray(key).toJavaList(clazz);
+        }else{
+            return null;
+        }
+    }
+
+
     public Boolean contaonsKey(Object key){
         return jsonObject.containsKey(key);
     }

+ 32 - 0
suishenbang-common/src/main/java/com/dgtly/common/utils/http/HttpUtils.java

@@ -20,6 +20,7 @@ import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 
 import com.alibaba.fastjson.JSONObject;
+import com.dgtly.common.exception.BusinessException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpEntity;
@@ -72,18 +73,22 @@ public class HttpUtils
         catch(ConnectException e)
         {
             log.error("调用HttpUtils.sendGet ConnectException, url=" + url , e);
+            throw new BusinessException("调用HttpUtils.sendGet ConnectException, url=" + url );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url , e);
+            throw new BusinessException("调用HttpUtils.sendGet SocketTimeoutException, url=" + url );
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendGet IOException, url=" + url, e);
+            throw new BusinessException("调用HttpUtils.sendGet IOException, url=" + url );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendGet Exception, url=" + url , e);
+            throw new BusinessException("调用HttpUtils.sendGet Exception, url=" + url );
         }
         finally
         {
@@ -142,18 +147,24 @@ public class HttpUtils
         catch (ConnectException e)
         {
             log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+
+            throw new BusinessException("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param );
+
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost Exception, url=" + url + ",param=" + param );
         }
         finally
         {
@@ -215,18 +226,22 @@ public class HttpUtils
         catch (ConnectException e)
         {
             log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param );
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendPost Exception, url=" + url + ",param=" + param );
         }
         finally
         {
@@ -280,18 +295,27 @@ public class HttpUtils
         catch(ConnectException e)
         {
             log.error("调用HttpUtils.sendGet ConnectException, url=" + url , e);
+
+            throw new BusinessException("调用HttpUtils.sendGet ConnectException, url=" + url  );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url , e);
+
+            throw new BusinessException("调用HttpUtils.sendGet SocketTimeoutException, url=" + url  );
+
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendGet IOException, url=" + url, e);
+
+            throw new BusinessException("调用HttpUtils.sendGet IOException, url=" + url  );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendGet Exception, url=" + url , e);
+
+            throw new BusinessException("调用HttpUtils.sendGet Exception, url=" + url  );
         }
         finally
         {
@@ -351,18 +375,22 @@ public class HttpUtils
         catch (ConnectException e)
         {
             log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param );
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendSSLPost Exception, url=" + url + ",param=" + param );
         }
         return result.toString();
     }
@@ -436,18 +464,22 @@ public class HttpUtils
         catch (ConnectException e)
         {
             log.error("调用HttpUtils.sendJsonPost ConnectException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendJsonPost ConnectException, url=" + url + ",param=" + param );
         }
         catch (SocketTimeoutException e)
         {
             log.error("调用HttpUtils.sendJsonPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendJsonPost SocketTimeoutException, url=" + url + ",param=" + param );
         }
         catch (IOException e)
         {
             log.error("调用HttpUtils.sendJsonPost IOException, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendJsonPost IOException, url=" + url + ",param=" + param );
         }
         catch (Exception e)
         {
             log.error("调用HttpsUtil.sendJsonPost Exception, url=" + url + ",param=" + param, e);
+            throw new BusinessException("调用HttpUtils.sendJsonPost Exception, url=" + url + ",param=" + param );
         }
         finally
         {

+ 9 - 0
suishenbang-system/src/main/java/com/dgtly/system/domain/SysUserExt.java

@@ -47,6 +47,7 @@ public class SysUserExt extends BaseEntity
 
     /** 岗位名称 */
     private String postName;
+    private Integer isChangeExt  =0;
 
     public void setUserId(Long userId)
     {
@@ -143,6 +144,14 @@ public class SysUserExt extends BaseEntity
         this.postName = postName;
     }
 
+    public Integer getIsChangeExt() {
+        return isChangeExt;
+    }
+
+    public void setIsChangeExt(Integer isChangeExt) {
+        this.isChangeExt = isChangeExt;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 11 - 0
suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserMapper.java

@@ -1,9 +1,11 @@
 package com.dgtly.system.mapper;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.dgtly.system.domain.SysUser;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -158,4 +160,13 @@ public interface SysUserMapper
      * @return 结果
      */
     public SysUser selectUserByEmplyeeId(String emplyeeId);
+
+    /**
+     * 根据销售组织代码 获取所属的用户登陆名称
+     *
+     * @param customerCodes 经销商列表
+     * @return 结果
+     */
+    @MapKey("customer_code")
+    Map<String,Map<String,Object>> selectLoginNamesByCostumerCode(String[] customerCodes);
 }

+ 7 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserExtService.java

@@ -68,4 +68,11 @@ public interface ISysUserExtService
      * @return 结果
      */
     public int deleteSysUserExtById(Long userId);
+    /**
+     * 插入或更新用户销售信息扩展
+     *
+     * @param sysUserExt 用户销售信息扩展
+     * @return 结果
+     */
+    public int insertOrUpSysUserExt(SysUserExt ext);
 }

+ 9 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserService.java

@@ -1,6 +1,7 @@
 package com.dgtly.system.service;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.dgtly.common.exception.BusinessException;
@@ -224,4 +225,12 @@ public interface ISysUserService
      * @return 结果
      */
     SysUser selectUserByEmplyeeId(String emplyeeId);
+
+    /**
+     * 根据销售组织代码 获取所属的用户登陆名称
+     *
+     * @param customerCodes 经销商
+     * @return 结果
+     */
+    Map<String,Map<String,Object>> selectLoginNamesByCostumerCode(Set<String> customerCodes);
 }

+ 10 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserExtServiceImpl.java

@@ -102,4 +102,14 @@ public class SysUserExtServiceImpl implements ISysUserExtService
     {
         return sysUserExtMapper.deleteSysUserExtById(userId);
     }
+    /**
+     * 插入或更新用户销售信息扩展
+     *
+     * @param sysUserExt 用户销售信息扩展
+     * @return 结果
+     */
+    @Override
+    public int insertOrUpSysUserExt(SysUserExt ext) {
+        return sysUserExtMapper.insertOrUpSysUserExt(ext);
+    }
 }

+ 14 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserServiceImpl.java

@@ -2,6 +2,7 @@ package com.dgtly.system.service.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.dgtly.system.domain.*;
@@ -581,4 +582,17 @@ public class SysUserServiceImpl implements ISysUserService
         return  userMapper.selectUserByEmplyeeId(emplyeeId);
     }
 
+    /**
+     * 根据销售组织代码 获取所属的用户登陆名称
+     *
+     * @param customerCodes 经销商列表
+     * @return 结果
+     */
+    @Override
+    public Map<String,Map<String,Object>> selectLoginNamesByCostumerCode(Set<String> customerCodes) {
+        String[] a = new String[customerCodes.size()];
+        a = customerCodes.toArray(a);
+        return userMapper.selectLoginNamesByCostumerCode(a);
+    }
+
 }

+ 11 - 0
suishenbang-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -328,4 +328,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		where suse.sap_employee_id = #{emplyeeId}
 	</select>
 
+
+	<select id="selectLoginNamesByCostumerCode" resultType="Map">
+		select DISTINCT sue.customer_code,GROUP_CONCAT(su.login_name SEPARATOR '|') touser from sys_user  su
+		left join sys_user_ext sue on sue.user_id = su.user_id
+		where sue.customer_code in
+		<foreach collection="array" item="customerCode" open="(" separator="," close=")">
+			#{customerCode}
+		</foreach>
+		GROUP BY sue.customer_code
+	</select>
+
 </mapper> 

+ 1 - 1
suishenbang-system/src/main/resources/mapper/system/SysUserSalesExtMapper.xml

@@ -154,5 +154,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         from sys_user_ext
         where boss_employee_id = #{bossEmployeeId,}
     </select>
-    
+
 </mapper>

+ 77 - 55
suishenbang-wxportal/suishenbang-wxportal-api/src/main/java/com/dgtly/wxportal/controller/WxController.java

@@ -7,17 +7,13 @@ import com.dgtly.common.core.domain.AjaxResult;
 import com.dgtly.common.core.domain.ParameterObject;
 import com.dgtly.common.utils.http.HttpUtils;
 import com.dgtly.common.utils.security.EncryptPassWordClass;
-import com.dgtly.wxportal.domain.WxBanner;
-import com.dgtly.wxportal.domain.WxMagnet;
+import com.dgtly.system.service.ISysConfigService;
 import com.dgtly.wxportal.utils.qywxutils.QyWxSendMessageUtil;
 import com.dgtly.wxportal.utils.qywxutils.QyWxUserUtil;
 import com.dgtly.common.utils.RedisUtil;
 import com.dgtly.system.domain.SysUser;
-import com.dgtly.wxportal.domain.WxQyUser;
 import com.dgtly.system.service.ISysUserService;
 import com.dgtly.wxportal.service.IWxQyUserService;
-import com.dgtly.wxportal.utils.qywxutils.messageModel.QyWxTextCard;
-import com.dgtly.wxportal.utils.qywxutils.messageModel.QyWxTextCardMessage;
 import com.dgtly.wxportal.utils.qywxutils.messageModel.QyWxTextMessage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -25,11 +21,14 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 @Api(tags = "企业微信相关API", description = "提供企业微信相关的AP")
@@ -40,10 +39,10 @@ public class WxController extends ApiBaseController {
 
 
     @Autowired
-    private RedisUtil redisUtil;
+    private QyWxUserUtil qyWxUserUtil;
 
     @Autowired
-    private QyWxUserUtil qyWxUserUtil;
+    private ISysConfigService configService;
 
     @Autowired
     private IWxQyUserService wxQyUserService;
@@ -81,7 +80,12 @@ public class WxController extends ApiBaseController {
         ParameterObject obj =  getParameterObject();
         obj.checkParameterNotNull("code");
         String code = obj.getString("code");
-        JSONObject json =  qyWxUserUtil.getUserId(code);
+        JSONObject json = new JSONObject();
+        try{
+            json =  qyWxUserUtil.getUserId(code);
+        }catch (Exception e){
+            logger.error("获取用户微信信息异常");
+        }
         String userId ="";
         if(!json.containsKey("UserId")){
             return AjaxResult.error(301,"当前用户不是企业成员");
@@ -95,63 +99,81 @@ public class WxController extends ApiBaseController {
         }
     }
 
-
-
-    @ApiOperation(value = "根据用户userId发送文本",
-            notes = "参数:{userId:123," +
-                    "content:\"XXXXXXXXXXXXXXXXXX\"} " +
-                    "错误:301 当前用户未绑定企业微信")
+    @ApiOperation(value = "根据用户经销商组织代码 customer_code发送文本",
+            notes = "参数:{\"XXX\":\"123,456\"}(说明:key是经销商code 值是订单编号列表)" )
     @ApiImplicitParams({
             @ApiImplicitParam(name = "params" , paramType = "body")
     })
-    @PostMapping("sendTextMessage")
+    @PostMapping("sendTextMessageByCustomerCode")
     public Object sendTextMessage(){
         ParameterObject obj =  getParameterObject();
-        obj.checkParameterNotNull("userId,content");
-        String userId = obj.getString("userId");
-        WxQyUser wxQyUser = wxQyUserService.selectWxQyUserBySysUserId(userId);
-        if(wxQyUser==null){
-            logger.error("发送企业微信细信息对象为空");
-            return AjaxResult.error(301,"发送对象位绑定企业微信");
+        JSONObject jobj = obj.getJSONObject();
+        Set<String> customerCodes = jobj.keySet();
+        Map<String,Map<String,Object>> maps = sysUserService.selectLoginNamesByCostumerCode(customerCodes);
+        String temple =configService.selectConfigByKey("wx.notification.time");
+        if(customerCodes.size()>0){
+            qyWxSendMessageUtil.sendNoticeMessage(customerCodes,obj.getJSONObject(),maps,temple);
         }
-        QyWxTextMessage qyWxTextMessage = new QyWxTextMessage();
-        qyWxTextMessage.setTouser(wxQyUser.getUserid());
-        qyWxTextMessage.setText(obj.getString("content"));
-
-        qyWxSendMessageUtil.sendMessage(qyWxTextMessage);
         return AjaxResult.success();
     }
 
-    @ApiOperation(value = "根据用户userId发送文本card",
-            notes = "参数:{userId:123," +
-                    "title:\"标题,不超过128个字节\"," +
-                    "description:\"描述,不超过512个字节\"" +
-                    "url:\"点击后跳转的链接。\"," +
-                    "btntxt:\"按钮文字。 默认为“详情”, 不超过4个文字\"} " +
-                    "错误:301 当前用户未绑定企业微信")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "params" , paramType = "body")
-    })
-    @PostMapping("sendTextCardMessage")
-    public Object sendTextCardMessage(){
-        ParameterObject obj =  getParameterObject();
-        obj.checkParameterNotNull("userId,title,description,url");
-        String userId = obj.getString("userId");
-
-        QyWxTextCard tc = obj.parseBean(QyWxTextCard.class);
 
-        WxQyUser wxQyUser = wxQyUserService.selectWxQyUserBySysUserId(userId);
-        if(wxQyUser==null){
-            logger.error("发送企业微信细信息对象为空");
-            return AjaxResult.error(301,"发送对象位绑定企业微信");
-        }
-        QyWxTextCardMessage q = new QyWxTextCardMessage();
 
-        q.setTouser(wxQyUser.getUserid());
-        q.setTextcard(tc);
-        qyWxSendMessageUtil.sendMessage(q);
-        return AjaxResult.success();
-    }
+//    @ApiOperation(value = "根据用户userId发送文本",
+//            notes = "参数:{userId:123," +
+//                    "content:\"XXXXXXXXXXXXXXXXXX\"} " +
+//                    "错误:301 当前用户未绑定企业微信")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "params" , paramType = "body")
+//    })
+//    @PostMapping("sendTextMessage")
+//    public Object sendTextMessage(){
+//        ParameterObject obj =  getParameterObject();
+//        obj.checkParameterNotNull("userId,content");
+//        Long userId = obj.getLong("userId");
+//        SysUser sysUser = sysUserService.selectUserById(userId);
+//        if(sysUser==null){
+//            logger.error("发送企业微信细信息对象为空");
+//            return AjaxResult.error(301,"未找到相应对象");
+//        }
+//        QyWxTextMessage qyWxTextMessage = new QyWxTextMessage();
+//        qyWxTextMessage.setTouser(sysUser.getLoginName());
+//        qyWxTextMessage.setText(obj.getString("content"));
+//
+//        qyWxSendMessageUtil.sendMessage(qyWxTextMessage);
+//        return AjaxResult.success();
+//    }
+//
+//    @ApiOperation(value = "根据用户userId发送文本card",
+//            notes = "参数:{userId:123," +
+//                    "title:\"标题,不超过128个字节\"," +
+//                    "description:\"描述,不超过512个字节\"" +
+//                    "url:\"点击后跳转的链接。\"," +
+//                    "btntxt:\"按钮文字。 默认为“详情”, 不超过4个文字\"} " +
+//                    "错误:301 当前用户未绑定企业微信")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "params" , paramType = "body")
+//    })
+//    @PostMapping("sendTextCardMessage")
+//    public Object sendTextCardMessage(){
+//        ParameterObject obj =  getParameterObject();
+//        obj.checkParameterNotNull("userId,title,description,url");
+//        Long userId = obj.getLong("userId");
+//
+//        QyWxTextCard tc = obj.parseBean(QyWxTextCard.class);
+//
+//        SysUser sysUser = sysUserService.selectUserById(userId);
+//        if(sysUser==null){
+//            logger.error("发送企业微信细信息对象为空");
+//            return AjaxResult.error(301,"未找到相应对象");
+//        }
+//        QyWxTextCardMessage q = new QyWxTextCardMessage();
+//
+//        q.setTouser(sysUser.getLoginName());
+//        q.setTextcard(tc);
+//        qyWxSendMessageUtil.sendMessage(q);
+//        return AjaxResult.success();
+//    }
 
     @ApiOperation(value = "根据立邦微信基建返回的Ticket获取用户信息",notes = "参数:{'Ticket':1}=" +
             " 错误:301 根据Ticket获取用户信息失败" +
@@ -188,7 +210,7 @@ public class WxController extends ApiBaseController {
         return AjaxResult.error(301,"根据Ticket获取用户信息失败");
     }
 
-    @ApiOperation(value = "根据账户密码获取用户权限",notes = "参数:{'username':'1','password':'xxx'}" +
+    @ApiOperation(value = "根据账户密码获取用户信息",notes = "参数:{'username':'1','password':'xxx'}" +
             " 错误:301 密码错误" +
             "错误:302  查无此人")
     @ApiImplicitParams({

+ 3 - 1
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxAccessTokenUtil.java

@@ -56,6 +56,7 @@ public class QyWxAccessTokenUtil {
             //token未过期使用缓存的token
             long currentTiem = new Date().getTime();
             if(this.accessToken!=null &&(currentTiem-createTime)<(expires*1000)){
+                log.info("本身的token为{}",this.accessToken);
                 return this.accessToken;
             }
             //获取请求地址
@@ -64,7 +65,7 @@ public class QyWxAccessTokenUtil {
         }catch (Exception e){
             this.accessToken=null;
             log.error("获取企业微信accesstoken错误",e);
-            throw new BusinessException("获取企业微信accesstoken错误",e);
+            throw e;
         }
         Integer errcode = json.getInteger("errcode");
         if(errcode!=0){
@@ -76,6 +77,7 @@ public class QyWxAccessTokenUtil {
         this.createTime = new Date().getTime();
         this.accessToken = token;
         this.expires = expires;
+        log.info("请求获得的token为{}",token);
         return token;
     }
 

+ 46 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxSendMessageUtil.java

@@ -4,21 +4,39 @@ package com.dgtly.wxportal.utils.qywxutils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.dgtly.common.utils.http.HttpUtils;
+import com.dgtly.system.service.ISysConfigService;
+import com.dgtly.system.service.ISysUserService;
+import com.dgtly.system.service.impl.SysConfigServiceImpl;
+import com.dgtly.system.service.impl.SysUserServiceImpl;
 import com.dgtly.wxportal.exception.QyWeixinException;
 import com.dgtly.wxportal.utils.qywxutils.messageModel.QyWxBaseMessage;
+import com.dgtly.wxportal.utils.qywxutils.messageModel.QyWxTextMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import java.util.Map;
+import java.util.Set;
+
 /**
  * 企业微信发送信息工具类
  */
 @Component
 public class QyWxSendMessageUtil {
+    private static final Logger log = LoggerFactory.getLogger(QyWxSendMessageUtil.class);
 
     @Autowired
     private QyWxAccessTokenUtil qyWxAccessTokenUtil;
 
 
+    @Autowired
+    private SysConfigServiceImpl configService;
+    @Autowired
+    private SysUserServiceImpl sysUserService;
+
+
     public boolean sendMessage(QyWxBaseMessage message){
 
         message.setAgentid(qyWxAccessTokenUtil.getAgentId());
@@ -32,5 +50,33 @@ public class QyWxSendMessageUtil {
         }
         return true;
 
+    }
+
+    @Async
+    public void sendNoticeMessage(Set<String> customerCodes,JSONObject obj, Map<String,Map<String,Object>> maps,String temple){
+        try {
+            Thread.sleep((long)10000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        if(customerCodes.size()>0){
+            for(String code:customerCodes){
+                if(maps.containsKey(code)&&maps.get(code).get("touser")!=null&&!maps.get(code).get("touser").toString().trim().equals("")){
+                    QyWxTextMessage qyWxTextMessage = new QyWxTextMessage();
+                    qyWxTextMessage.setTouser(maps.get(code).get("touser").toString());
+                    qyWxTextMessage.setText(String.format(temple,obj.getString(code)));
+                    try{
+                        sendMessage(qyWxTextMessage);
+                    }catch (Exception e){
+                        log.error("对"+maps.get(code).get("touser")+"发送消息失败",e);
+                    }
+                }else{
+                    log.error("经销商code为:"+code+"的经销商未发现相应人员!!");
+                }
+            }
+        }
+
+
+
     }
 }

+ 10 - 2
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxUserUtil.java

@@ -6,6 +6,8 @@ import com.dgtly.common.utils.RedisUtil;
 import com.dgtly.common.utils.http.HttpUtils;
 import com.dgtly.wxportal.domain.WxQyUser;
 import com.dgtly.wxportal.service.IWxQyUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -16,7 +18,7 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class QyWxUserUtil {
-
+    private static final Logger log = LoggerFactory.getLogger(QyWxUserUtil.class);
 
     @Autowired
     private IWxQyUserService wxQyUserService;
@@ -33,8 +35,14 @@ public class QyWxUserUtil {
      */
     public JSONObject getUserId(String code) {
         String url = QyWxServiceUrl.USERINFO_URL.getformatUrl(qyWxAccessTokenUtil.getAccessToken(),code );
+        JSONObject json;
+        try{
+            json = JSONObject.parseObject(HttpUtils.sendGet(url));
+        }catch (Exception e){
+            log.error("获取WX用户信息失败!",e);
+            throw e;
+        }
 
-        JSONObject json  = JSONObject.parseObject(HttpUtils.sendGet(url));
         Integer errcode = json.getInteger("errcode");
         if(errcode!=0){
             throw new QyWeixinException(errcode,url);