Browse Source

Merge branch 'dev' of ssh://10.10.100.21/source/saas-platform into dev

zhuth 7 years ago
parent
commit
9046fac9e1
39 changed files with 872 additions and 32 deletions
  1. 2 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java
  2. 1 1
      applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml
  3. 1 1
      applications/commons/commons-server/src/main/resources/mapper/HomePageMapper.xml
  4. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java
  5. 18 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  6. 1 1
      applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml
  7. 13 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  8. 11 6
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  9. 2 2
      applications/sale/sale-server/src/main/resources/mapper/SaledetailMapper.xml
  10. 9 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountAddDTO.java
  11. 10 0
      base-servers/account/account-server/pom.xml
  12. 51 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  13. 1 1
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  14. 18 0
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java
  15. 61 0
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/dto/SsoAddUser.java
  16. 7 5
      base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java
  17. 2 1
      base-servers/sms/pom.xml
  18. 29 1
      base-servers/sms/sms-api/pom.xml
  19. 18 0
      base-servers/sms/sms-api/src/main/java/com.usoftchina.saas.sms.api/SmsApi.java
  20. 15 0
      base-servers/sms/sms-dto/pom.xml
  21. 55 0
      base-servers/sms/sms-dto/src/main/java/com/usoftchina/saas/sms/dto/SmsDTO.java
  22. 62 3
      base-servers/sms/sms-server/pom.xml
  23. 2 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/SmsApplication.java
  24. 45 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/config/SmsConfig.java
  25. 32 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/controller/SmsController.java
  26. 17 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/SmsService.java
  27. 46 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/impl/SmsServiceImpl.java
  28. 79 0
      base-servers/sms/sms-server/src/main/resources/application.yml
  29. BIN
      base-servers/sms/sms-server/src/main/resources/auth/pub.key
  30. 131 0
      base-servers/sms/sms-server/src/main/resources/logback-spring.xml
  31. 43 0
      base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/api/SmsApiTest.java
  32. 59 0
      base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/service/SmsServiceTest.java
  33. 20 0
      framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java
  34. 1 0
      frontend/saas-web/app/view/core/form/FormPanelController.js
  35. 1 0
      frontend/saas-web/app/view/core/form/MseeageLog.js
  36. 1 1
      frontend/saas-web/app/view/home/infoCardList/SaleOut.js
  37. 1 1
      frontend/saas-web/app/view/sys/guide/FormPanel.js
  38. 1 1
      frontend/saas-web/package.json
  39. 4 4
      frontend/saas-web/resources/json/navigation.json

+ 2 - 1
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java

@@ -36,7 +36,8 @@ public class ListReqDTO implements Serializable {
                     JSONObject obj = (JSONObject) jsonArray.get(i);
                     field = obj.get("field");
                     operation = obj.get("operation");
-                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation)) {
+                    //
+                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation) && !operation.toString().startsWith("customize")) {
                         fieldSql = new StringBuilder("'{");
                         fieldSql.append("\"" + field + "\":'");
                         fieldSql.append(",");

+ 1 - 1
applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml

@@ -8,7 +8,7 @@
     </parameterMap>
 
     <select id="selectPeriod" resultType="string">
-        select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_status=0 order by PD_DETNO LIMIT 1;
+        select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_detno is not null and pd_status=0 order by PD_DETNO LIMIT 1;
     </select>
     <select id="selectUnPeriod" resultType="string">
         select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_status=99 order by PD_DETNO desc LIMIT 1;

+ 1 - 1
applications/commons/commons-server/src/main/resources/mapper/HomePageMapper.xml

@@ -67,7 +67,7 @@
     <select id="getSaleData" parameterType="long" resultType="string">
       select concat('[',five,',',other,']') from ((
 
-    select GROUP_CONCAT(concat('{"x":"',si_custname,'","y":',IFNULL(round(si_amount/10000,2),0),',"z":"',si_custshortname,'"}')) five from (
+    select GROUP_CONCAT(concat('{"x":"',si_custname,'","y":',IFNULL(round(si_amount/10000,2),0),',"z":"',ifnull(si_custshortname,''),'"}')) five from (
     select * from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE' ORDER BY si_amount desc limit 0,5
     ) c)d,(
 

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java

@@ -52,4 +52,6 @@ public interface ProductMapper extends CommonBaseMapper<Product> {
     Long selectIdByCode(@Param("code") String code, @Param("companyId") Long companyId);
 
     List<ProductReserveCostDTO> selectReserveCostByIgnoreWarehouse(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

+ 18 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.document.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -509,7 +510,23 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         //取分页信息
         PageInfo<ProductReserveCostDTO> pageInfo = new PageInfo<ProductReserveCostDTO>(reserveCostList);
         map.put("list", pageInfo);
-        map.put("calculate", null);
+        //替换listReqDTO中的数据
+        String calculateFields = listReqDTO.getCalculateFields().replaceAll("rc_amount", "pw_amount").replaceAll("pw_onhand", "rc_number");
+        listReqDTO.setCalculateFields(calculateFields);
+        //取对应计算数据
+        String calculateFieldsSql = listReqDTO.getCalculateFieldsSql();
+        Long companyId = BaseContextHolder.getCompanyId();
+        String condition = listReqDTO.getFinalCondition();
+        JSONArray arr = new JSONArray();
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = getMapper().selectCalculateFields(calculateFieldsSql, condition, companyId);
+            res = res.replaceAll("pw_amount", "rc_amount").replace("pw_onhand", "rc_number");
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("calculate", arr);
         return map;
     }
 

+ 1 - 1
applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml

@@ -156,7 +156,7 @@
         #{cu_code,jdbcType=VARCHAR},
       </if>
       <if test="cu_shortname !=null">
-        #{cu_shortname,jdbcType=VARCHAR}
+        #{cu_shortname,jdbcType=VARCHAR},
       </if>
       <if test="cu_name != null">
         #{cu_name,jdbcType=VARCHAR},

+ 13 - 0
applications/document/document-server/src/main/resources/mapper/ProductMapper.xml

@@ -491,6 +491,19 @@
         group by pr_code,pr_spec,pr_detail,pr_unit,pr_id
         ORDER BY PR_ID DESC
     </select>
+    <select id="selectCalculateFields" resultType="string">
+        select   ${fields}
+        from productWH tab left join Product on pw_prodcode=pr_code left join warehouse on pw_whid=wh_id
+        <where>
+            <if test="con != null">
+                ${con}
+            </if>
+            <if test="companyId!=null">
+                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
+                and pw_onhand!=0
+            </if>
+        </where>
+    </select>
     <select id="getCountFromPurc" resultType="int">
         SELECT COUNT(*) FROM PURCHASEDETAIL
         WHERE PD_PRODID = #{id} AND COMPANYID=#{companyId}

+ 11 - 6
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java

@@ -246,7 +246,7 @@ public class SaleServiceImpl implements SaleService{
     }
 
     @Transactional
-    private void singleAudit(Long id) {
+    public void singleAudit(Long id) {
         Integer integer = saleMapper.checkCustomer(id);
         if (integer > 0) {
             throw new BizException(BizExceptionCode.SALE_CUST_CLOSE);
@@ -377,12 +377,13 @@ public class SaleServiceImpl implements SaleService{
         //部分入库、全部入库
         int partTurnCount = 0,turnCount = 0;
         if(saleDetailList != null && saleDetailList.size() > 0){
+            Double yqty = 0.0;
             for(SaleDetail saleDetail : saleDetailList){
-                //
-                if(saleDetail.getSd_yqty() >= saleDetail.getSd_qty()){
+                yqty = saleDetail.getSd_yqty() == null ? 0.0 : saleDetail.getSd_yqty();
+                if(yqty >= saleDetail.getSd_qty()){
                     turnCount++;
 
-                }else if(saleDetail.getSd_yqty() > 0 && saleDetail.getSd_yqty() < saleDetail.getSd_qty()){
+                }else if(yqty > 0 && yqty < saleDetail.getSd_qty()){
                     //     0 < 入库数 < 采购数
                     partTurnCount++;
                 }
@@ -432,7 +433,7 @@ public class SaleServiceImpl implements SaleService{
         //检查从表
         for (SaleDetail detail : details) {
             pdQty = detail.getSd_qty();
-            pdYqty = detail.getSd_yqty();
+            pdYqty = detail.getSd_yqty() == null ? 0 : detail.getSd_yqty();
             if (pdQty - pdYqty > 0){
                 count++;
             }
@@ -482,8 +483,12 @@ public class SaleServiceImpl implements SaleService{
             prodIODetail.setPd_taxrate(saleDetail.getSd_taxrate());
             //公司id
             prodIODetail.setCompanyId(companyId);
+            //如果已转数等于转单数量 不处理该单据
+            if (saleDetail.getSd_qty() - (saleDetail.getSd_yqty() == null ? 0 : saleDetail.getSd_yqty()) == 0) {
+                continue;
+            }
             //本次转单数
-            prodIODetail.setPd_outqty(saleDetail.getSd_qty() - saleDetail.getSd_yqty());
+            prodIODetail.setPd_outqty(saleDetail.getSd_qty() - (saleDetail.getSd_yqty() == null ? 0 : saleDetail.getSd_yqty()));
             //获取物料默认仓库
             Map<String, Object> warehouse = getWareHouseByCode(saleDetail.getSd_prodcode());
             if (null != warehouse) {

+ 2 - 2
applications/sale/sale-server/src/main/resources/mapper/SaledetailMapper.xml

@@ -317,7 +317,7 @@
     companyId, updaterId, updateTime,
     sd_text1, sd_text2, sd_text3,
     sd_text4, sd_text5,
-    creatorId,createTime,creatorName)
+    creatorId,createTime,creatorName, sd_yqty)
     values
     <foreach collection="list" item="item" index="index" open="" close="" separator=",">
       (
@@ -329,7 +329,7 @@
       #{item.companyId,jdbcType=INTEGER}, #{item.updaterId,jdbcType=INTEGER}, #{item.updateTime,jdbcType=TIMESTAMP},
       #{item.sd_text1,jdbcType=VARCHAR}, #{item.sd_text2,jdbcType=VARCHAR}, #{item.sd_text3,jdbcType=VARCHAR},
       #{item.sd_text4,jdbcType=VARCHAR}, #{item.sd_text5,jdbcType=VARCHAR},
-      #{item.creatorId,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.creatorName,jdbcType=VARCHAR}
+      #{item.creatorId,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.creatorName,jdbcType=VARCHAR},#{item.sd_yqty,jdbcType=DOUBLE}
       )
     </foreach>
   </insert>

+ 9 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountAddDTO.java

@@ -23,6 +23,15 @@ public class AccountAddDTO implements Serializable {
     private Integer type;
     private Long uu;
     private String roleIds;
+    private boolean hasRegister;
+
+    public boolean isHasRegister() {
+        return hasRegister;
+    }
+
+    public void setHasRegister(boolean hasRegister) {
+        this.hasRegister = hasRegister;
+    }
 
     public String getRoleIds() {
         return roleIds;

+ 10 - 0
base-servers/account/account-server/pom.xml

@@ -42,6 +42,16 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>file-dto</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>

+ 51 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java

@@ -1,7 +1,9 @@
 package com.usoftchina.saas.account.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.usoftchina.saas.account.dto.*;
 import com.usoftchina.saas.account.po.Account;
+import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.po.RoleResource;
 import com.usoftchina.saas.account.service.AccountService;
 import com.usoftchina.saas.account.service.CompanyService;
@@ -15,11 +17,15 @@ import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.sms.api.SmsApi;
+import com.usoftchina.saas.sms.dto.SmsDTO;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
+import com.usoftchina.saas.utils.StringUtils;
 import com.usoftchina.sso.api.SsoUserApi;
-import com.usoftchina.sso.dto.SsoCheckMobile;
+import com.usoftchina.sso.api.SsoUserSpaceApi;
+import com.usoftchina.sso.dto.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -43,6 +49,12 @@ public class AccountController {
     private RoleService roleService;
     @Autowired
     private SsoUserApi ssoUserApi;
+    @Autowired
+    private SsoUserSpaceApi ssoUserSpaceApi;
+    @Autowired
+    private SmsApi smsApi;
+
+    private final String msgTemplateCode = "SMS_152288990";
 
     /**
      * 注册
@@ -115,6 +127,7 @@ public class AccountController {
      */
     @PostMapping("/register/add")
     public Result AddAccount(@RequestBody AccountAddDTO accountAddDTO) {
+        String mobile = accountAddDTO.getMobile();
         Account account = null;
         // 根据手机号、邮箱、用户名片段判断是否已注册
         boolean checked = accountService.findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
@@ -123,6 +136,43 @@ public class AccountController {
             account = BeanMapper.map(accountAddDTO, Account.class);
             account.setEnabled(true);
             accountService.save(account);
+            if (!accountAddDTO.isHasRegister()) {
+                //1.添加至优软云
+                String password = StringUtils.createInitPassword(mobile.substring(mobile.length() - 3, mobile.length()));
+                Company company = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId());
+                String companyName = company.getName();
+
+                //可能存在开通企业时UU号同步到优软云出错的情况,再重新同步一次
+                if (company.getUu() == null) {
+                    Account accountTmp = accountService.findByPrimaryKey(company.getCreatorId());
+                    ssoUserSpaceApi.registerLogin(companyName, company.getBusinessCode(), accountTmp.getUu());
+                    SsoUserSpaceList ssoUserSpaceList = ssoUserApi.getUserSpacesByMobile(accountTmp.getMobile());
+                    List<SsoUserSpace> ssoUserSpaces = ssoUserSpaceList.getSpaces();
+                    if (ssoUserSpaces.size() > 0) {
+                        for (SsoUserSpace ssoUserspace : ssoUserSpaces) {
+                            if (companyName.equals(ssoUserspace.getSpaceName())) {
+                                company.setUu(ssoUserspace.getSpaceUU());
+                                companyService.updateUUByPrimaryKey(company.getId(), ssoUserspace.getSpaceUU());
+                            }
+                        }
+                    }
+                }
+                SsoResult result = ssoUserApi.add("add", "sp", accountAddDTO.getRealname(), mobile, password, company.getUu());
+                //2.调用短信服务,将密码以短信的形式发送到用户的手机上
+                if (result.isSuccess()) {
+                    SmsDTO smsDTO = new SmsDTO();
+                    smsDTO.setMobile(mobile);
+                    smsDTO.setSignName("优软云");
+                    smsDTO.setTemplateCode(msgTemplateCode);
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("password", password);
+                    smsDTO.setTemplateParam(jsonObject.toJSONString());
+                    Result sendResult = smsApi.sendRegisterMsg(smsDTO);
+                    if (!sendResult.isSuccess()) {
+                        return sendResult;
+                    }
+                }
+            }
         }else{
             Account accountTemp = accountService.findByMobile(accountAddDTO.getMobile());
             if (accountTemp == null){

+ 1 - 1
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java

@@ -264,9 +264,9 @@ public class AuthController {
                 TokenDTO tokenDTO = BeanMapper.map(jwtToken, TokenDTO.class);
                 socketMessageApi.sendToClient(clientId, "/sso/callback",
                         JsonUtils.toJsonString(new AuthDTO(tokenDTO, accountDTO)));
-                return "successCallback({success:'1'})";
             }
             ServletUtils.writeJsonPMessage(response, callback, true);
+            return "successCallback({success:'1'})";
         }
         return "successCallback({success:'0'})";
     }

+ 18 - 0
base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java

@@ -68,6 +68,20 @@ public interface SsoUserApi {
     @RequestMapping(params = "_operate=bind", method = RequestMethod.POST)
     String bind(@RequestParam("_operate") String _operate, @RequestParam("appId") String appId, @RequestParam("userUU") Long userUU, @RequestParam("spaceUU") Long spaceUU);
 
+    /**
+     * 企业添加未注册用户
+     * @param _operate  add
+     * @param appId     应用ID
+     * @param vipName   姓名
+     * @param mobile    手机号
+     * @param password  密码
+     * @param spaceUU   公司UU
+     * @return
+     */
+    @RequestMapping(params = "_operate=add", method = RequestMethod.POST)
+    SsoResult add(@RequestParam("_operate") String _operate, @RequestParam("appId") String appId, @RequestParam("vipName") String vipName,
+                  @RequestParam("mobile") String mobile, @RequestParam("password") String password, @RequestParam("spaceUU") Long spaceUU);
+
     @Component
     class DefaultFallback implements SsoUserApi{
         @Override
@@ -95,5 +109,9 @@ public interface SsoUserApi {
             return null;
         }
 
+        @Override
+        public SsoResult add(String _operate, String appId, String vipName, String mobile, String password, Long spaceUU) {
+            return null;
+        }
     }
 }

+ 61 - 0
base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/dto/SsoAddUser.java

@@ -0,0 +1,61 @@
+package com.usoftchina.sso.dto;
+
+import java.io.Serializable;
+
+public class SsoAddUser implements Serializable {
+
+    private String _operate;
+    private String appId;
+    private Long spaceUU;
+    private String vipName;
+    private String mobile;
+    private String password;
+
+    public String get_operate() {
+        return _operate;
+    }
+
+    public void set_operate(String _operate) {
+        this._operate = _operate;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public Long getSpaceUU() {
+        return spaceUU;
+    }
+
+    public void setSpaceUU(Long spaceUU) {
+        this.spaceUU = spaceUU;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

+ 7 - 5
base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java

@@ -2,10 +2,7 @@ package com.usoftchina.sso.test;
 
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.sso.api.SsoUserApi;
-import com.usoftchina.sso.dto.SsoCheckMobile;
-import com.usoftchina.sso.dto.SsoResult;
-import com.usoftchina.sso.dto.SsoUser;
-import com.usoftchina.sso.dto.SsoUserSpaceList;
+import com.usoftchina.sso.dto.*;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -13,7 +10,6 @@ import org.junit.runners.MethodSorters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @author yingp
@@ -69,4 +65,10 @@ public class SsoUserApiTest {
         String result = ssoUserApi.bind("bind","trade-app", userUU, companyUU);
         System.out.println(result);
     }
+
+    @Test
+    public void testG_add(){
+        SsoResult result = ssoUserApi.add("add", "sp","陈炜","18702604854","123456",10050513L);
+        System.out.println(result);
+    }
 }

+ 2 - 1
base-servers/sms/pom.xml

@@ -11,10 +11,11 @@
 
     <artifactId>sms</artifactId>
     <packaging>pom</packaging>
-    <description>sms</description>
+    <description>sms server</description>
     <modules>
         <module>sms-api</module>
         <module>sms-server</module>
+        <module>sms-dto</module>
     </modules>
 
 

+ 29 - 1
base-servers/sms/sms-api/pom.xml

@@ -10,7 +10,35 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>sms-api</artifactId>
-    <description>sms api</description>
+    <description>sms service api</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form-spring</artifactId>
+        </dependency>
+    </dependencies>
 
 
 </project>

+ 18 - 0
base-servers/sms/sms-api/src/main/java/com.usoftchina.saas.sms.api/SmsApi.java

@@ -0,0 +1,18 @@
+package com.usoftchina.saas.sms.api;
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = "sms-server")
+public interface SmsApi {
+
+    /**
+     * 注册成功发送手机短信
+     * @param smsDTO
+     */
+    @PostMapping(value = "/msg/register")
+    Result sendRegisterMsg(@RequestBody SmsDTO smsDTO);
+}

+ 15 - 0
base-servers/sms/sms-dto/pom.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>sms</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>sms-dto</artifactId>
+
+
+</project>

+ 55 - 0
base-servers/sms/sms-dto/src/main/java/com/usoftchina/saas/sms/dto/SmsDTO.java

@@ -0,0 +1,55 @@
+package com.usoftchina.saas.sms.dto;
+
+import java.io.Serializable;
+
+public class SmsDTO implements Serializable {
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 短信签名
+     */
+    private String signName;
+    /**
+     * 短信模板
+     */
+    private String templateCode;
+    /**
+     * 参数,用于替换模板中的变量 格式:{“name":"admin","tel":"18888888888"}
+     */
+    private String templateParam;
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getSignName() {
+        return signName;
+    }
+
+    public void setSignName(String signName) {
+        this.signName = signName;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public void setTemplateCode(String templateCode) {
+        this.templateCode = templateCode;
+    }
+
+    public String getTemplateParam() {
+        return templateParam;
+    }
+
+    public void setTemplateParam(String templateParam) {
+        this.templateParam = templateParam;
+    }
+}

+ 62 - 3
base-servers/sms/sms-server/pom.xml

@@ -12,14 +12,28 @@
     <artifactId>sms-server</artifactId>
     <description>sms server</description>
     <dependencies>
-        <dependency>
+       <!-- <dependency>
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>auth-client</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>server-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -39,14 +53,23 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
-        <dependency>
+        <!--<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+        <!-- sleuth -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>
@@ -65,6 +88,42 @@
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
         </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+        <!-- aliyun sms SDK -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+        <!-- Test -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 2 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/SmsApplication.java

@@ -3,12 +3,14 @@ package com.usoftchina.saas.sms;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @author yingp
  * @date 2018/10/10
  */
 @SpringBootApplication
+@EnableFeignClients("com.usoftchina.saas.sms.api")
 @EnableEurekaClient
 public class SmsApplication {
     public static void main(String[] args) {

+ 45 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/config/SmsConfig.java

@@ -0,0 +1,45 @@
+package com.usoftchina.saas.sms.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties("sms.config")
+public class SmsConfig {
+
+    private String product;
+    private String domain;
+
+    private String accessKeyId;
+    private String accessKeySecret;
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+}

+ 32 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/controller/SmsController.java

@@ -0,0 +1,32 @@
+package com.usoftchina.saas.sms.controller;
+
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import com.usoftchina.saas.sms.service.SmsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@EnableConfigurationProperties(SmsConfig.class)
+public class SmsController {
+
+    @Autowired
+    private SmsConfig smsConfig;
+    @Autowired
+    private SmsService smsService;
+
+    @PostMapping("/msg/register")
+    public Result sendRegisterMsg(@RequestBody SmsDTO smsDTO){
+        try {
+            smsService.sendMessage(smsConfig, smsDTO);
+        } catch (ClientException e) {
+            return Result.error(new BizException(Integer.parseInt(e.getErrCode()), e.getMessage()));
+        }
+        return Result.success();
+    }
+
+}

+ 17 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/SmsService.java

@@ -0,0 +1,17 @@
+package com.usoftchina.saas.sms.service;
+
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+
+public interface SmsService {
+
+    /**
+     * 发送短信
+     * @param smsDTO
+     * @return
+     */
+    SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException;
+
+}

+ 46 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/impl/SmsServiceImpl.java

@@ -0,0 +1,46 @@
+package com.usoftchina.saas.sms.service.impl;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import com.usoftchina.saas.sms.service.SmsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SmsServiceImpl implements SmsService {
+
+    @Override
+    public SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException {
+        //设置超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", smsConfig.getProduct(), smsConfig.getDomain());
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+        //组装请求对象
+        SendSmsRequest request = new SendSmsRequest();
+        //待发送手机号
+        request.setPhoneNumbers(smsDTO.getMobile());
+        //短信签名
+        request.setSignName(smsDTO.getSignName());
+        //短信模板
+        request.setTemplateCode(smsDTO.getTemplateCode());
+        //变量
+        request.setTemplateParam(smsDTO.getTemplateParam());
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = acsClient.getAcsResponse(request);
+        }catch (Exception e){
+            return null;
+        }
+        return sendSmsResponse;
+    }
+
+}

+ 79 - 0
base-servers/sms/sms-server/src/main/resources/application.yml

@@ -0,0 +1,79 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: sms-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+  redis:
+    host: 192.168.0.182
+    port: 6379
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+server:
+  port: 8680
+  tomcat:
+    uri-encoding: UTF-8
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+auth:
+  public-key: auth/pub.key
+sms:
+  config:
+    product: Dysmsapi
+    domain: dysmsapi.aliyuncs.com
+    accessKeyId: LTAIf3jgw6hzVhw0
+    accessKeySecret: tvR2pvO3HtB7gay7EXFgg0SEp2rXon

BIN
base-servers/sms/sms-server/src/main/resources/auth/pub.key


+ 131 - 0
base-servers/sms/sms-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/base.xml" />
+    <jmxConfigurator/>
+
+    <!--
+    %m
+    输出代码中指定的消息
+    %p
+    输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
+    %r
+    输出自应用启动到输出该log信息耗费的毫秒数
+    %c
+    输出所属的类目,通常就是所在类的全名
+    %t
+    输出产生该日志事件的线程名
+    %n
+    输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
+    %d
+    输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},
+    输出类似:2002年10月18日 22:10:28,921
+    %l
+    输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
+    -->
+
+    <springProperty scope="context" name="log.path" source="logging.path" defaultValue="/var/log/saas/sms-server"/>
+    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="sms-server"/>
+    <springProperty scope="context" name="spring.profiles.active" source="spring.profiles.active" defaultValue="dev"/>
+    <springProperty scope="context" name="common-pattern" source="logging.common-pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS}:[%5p] [%t:%r] [%C{1}:%M:%L] --> %m%n"/>
+    <springProperty scope="context" name="log.level.console" source="logging.level.console" defaultValue="INFO"/>
+    <springProperty scope="context" name="log.destination" source="logging.destination" defaultValue="192.168.0.63:5000"/>
+
+    <contextName>${spring.application.name}-${spring.profiles.active}-logback</contextName>
+
+    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>${log.level.console}</level>
+        </filter>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/root.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM}/root-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
+            <maxFileSize>128MB</maxFileSize>
+            <maxHistory>7</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Appender to log in a JSON format -->
+    <appender name="JSON_APPENDER" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>${log.destination}</destination>
+        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${spring.application.name:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "parent": "%X{X-B3-ParentSpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "rest": "%message"
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>
+
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="com.usoftchina.saas" level="INFO"/>
+
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="ROOT_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-test">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-prod">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+</configuration>

+ 43 - 0
base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/api/SmsApiTest.java

@@ -0,0 +1,43 @@
+package com.usoftchina.saas.sms.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author chenwei
+ * @date 2018/12/08
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SmsApiTest {
+
+    @Autowired
+    private SmsApi smsApi;
+
+    private final String mobile = "18702604854";
+    private final String msgTemplateCode = "SMS_152288990";
+    private final String password = "cw123456";
+
+    @Test
+    public void testA_register(){
+        SmsDTO smsDTO = new SmsDTO();
+        smsDTO.setMobile(mobile);
+        smsDTO.setSignName("优软云");
+        smsDTO.setTemplateCode(msgTemplateCode);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("password", password);
+        smsDTO.setTemplateParam(jsonObject.toJSONString());
+        Result sendResult = smsApi.sendRegisterMsg(smsDTO);
+        System.out.println(sendResult.getCode() + "========" + sendResult.getMessage());
+    }
+
+}

+ 59 - 0
base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/service/SmsServiceTest.java

@@ -0,0 +1,59 @@
+package com.usoftchina.saas.sms.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author chenwei
+ * @date 2018/12/07
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SmsServiceTest {
+
+    @Autowired
+    private SmsService smsService;
+
+    private final String product = "Dysmsapi";
+    private final String domain = "dysmsapi.aliyuncs.com";
+    private final String accessKeyId = "LTAIf3jgw6hzVhw0";
+    private final String accessKeySecret = "tvR2pvO3HtB7gay7EXFgg0SEp2rXon";
+    private final String templateCode = "SMS_152288990";  //SMS_152288681
+
+    @Test
+    public void testA_sendMessage(){
+        SmsConfig smsConfig = new SmsConfig();
+        smsConfig.setProduct(product);
+        smsConfig.setDomain(domain);
+        smsConfig.setAccessKeyId(accessKeyId);
+        smsConfig.setAccessKeySecret(accessKeySecret);
+
+        SmsDTO smsDTO = new SmsDTO();
+        smsDTO.setMobile("18702604854");
+        smsDTO.setSignName("优软云");
+        smsDTO.setTemplateCode(templateCode);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("password", "123456");
+        smsDTO.setTemplateParam(jsonObject.toJSONString());
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = smsService.sendMessage(smsConfig, smsDTO);
+            System.out.println(sendSmsResponse);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+}

+ 20 - 0
framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.utils;
 
 import java.util.Date;
+import java.util.Random;
 
 /**
  * @author yingp
@@ -39,4 +40,23 @@ public abstract class StringUtils extends org.springframework.util.StringUtils{
     public static String createBusinessCode() {
         return BUSINESSCODE_PREFIX + DateUtils.getCurrentDate("yyyyMMdd") + (int)(Math.random()*1000 + 1000);
     }
+
+    public static String createInitPassword(String suffix){
+        Random random = new Random();
+        StringBuilder value = new StringBuilder();
+        // 生成4个字母
+        for (int i=0; i<3; i++) {
+            int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
+            value.append((char)(choice + random.nextInt(26)));
+        }
+
+        // 3个数字
+        String number = random.nextInt(999) + 1000 + "";
+        number = number.substring(number.length() - 3, number.length());
+        value.append(number);
+
+        // 后缀
+        value.append(suffix);
+        return value.toString();
+    }
 }

+ 1 - 0
frontend/saas-web/app/view/core/form/FormPanelController.js

@@ -403,6 +403,7 @@ Ext.define('saas.view.core.form.FormPanelController', {
                 closable: true,
                 layout: 'fit',
                 items: [{
+                    padding:'5 10 5 10',
                     xtype: 'core-form-mseeageLog',
                     mlKeyvalue:mlKeyvalue,
                     mlCaller:mlCaller

+ 1 - 0
frontend/saas-web/app/view/core/form/MseeageLog.js

@@ -121,6 +121,7 @@ Ext.define('saas.view.core.form.MseeageLog', {
 
             Ext.apply(me, {
                 dockedItems:[{
+                    style:'padding: 3px 0 3px 0px;height: 36px;',
                     xtype: 'pagingtoolbar',
                     dock: 'bottom',
                     displayInfo: true,

+ 1 - 1
frontend/saas-web/app/view/home/infoCardList/SaleOut.js

@@ -10,7 +10,7 @@ Ext.define('saas.view.home.infoCardList.SaleOut', {
     codeField: 'sa_code',
     detailTitle: '销售订单',
     detailXType: 'sale-sale-formpanel',
-    condition: 'sale.companyid=#{companyId} and sa_statuscode=\'AUDITED\' and exists (select 1 from saledetail detail where sd_id=saledetail.sd_id and  IFNULL(sa_sendstatus,\' \') <> \'已出库\' ',
+    condition: 'sale.companyid=#{companyId} and sa_statuscode=\'AUDITED\' and exists (select 1 from saledetail detail where sd_id=saledetail.sd_id and  IFNULL(sd_sendqty,0)<ifnull(sd_qty,0) and TO_DAYS(sd_delivery)-TO_DAYS(now())<= 7)',
     listColumns: [{
         text: 'id',
         dataIndex: 'sa_id',

+ 1 - 1
frontend/saas-web/app/view/sys/guide/FormPanel.js

@@ -222,7 +222,7 @@ Ext.define('saas.view.sys.guide.FormPanel', {
         if(type=='warehouse'){
             message = '<span>因为新增物料时需要告知该物料所属仓库是哪里,所以需要首先进行仓库管理。</br>'+
             '录入完成后切换到“新手导航”页签继续下一步。</span>';
-            xtype = 'other-warehouse';
+            xtype = 'document-warehouse-datalist';
             title = '仓库资料'
         }
         if(type=='product'){

+ 1 - 1
frontend/saas-web/package.json

@@ -7,7 +7,7 @@
     "test": "echo \"Error: no test specified\" && exit 1",
     "dev": "sencha app watch",
     "build-dev": "sencha app build --build dev --testing",
-    "build-test": "sencha app build --build test --production",
+    "build-test": "sencha app build --build test --testing",
     "build": "sencha app build --build prod --production"
   },
   "keywords": [

+ 4 - 4
frontend/saas-web/resources/json/navigation.json

@@ -74,10 +74,6 @@
             "text": "客户对账单",
             "id": "monry-report-customercheck",
             "viewType":"monry-report-customercheck"
-        },{
-            "text":"其他收支明细表",
-            "id":"money-report-otheriodetail",
-            "viewType":"monry-report-otheriodetail"
         }]
     }]
 }, {
@@ -185,6 +181,10 @@
             "id": "monry-report-accountdetails",
             "viewType":"monry-report-accountdetails"
         }, {
+            "text":"其他收支明细表",
+            "id":"money-report-otheriodetail",
+            "viewType":"monry-report-otheriodetail"
+        },{
             "text": "账户收支明细表",
             "id": "monry-report-accountbalance",
             "viewType":"monry-report-accountbalance"