Browse Source

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

jinsy 7 years ago
parent
commit
a2b302a32c
31 changed files with 401 additions and 114 deletions
  1. 2 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 16 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/CommonController.java
  3. 6 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/VerificationController.java
  4. 5 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/VerificationService.java
  5. 6 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/RecbalanceServiceImpl.java
  6. 9 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/VerificationServiceImpl.java
  7. 4 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java
  8. 12 4
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  9. 1 0
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml
  10. 10 1
      applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml
  11. 2 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java
  12. 33 4
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  13. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleMapper.java
  14. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java
  15. 13 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  16. 5 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java
  17. 3 0
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  18. 18 5
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java
  19. 7 0
      base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java
  20. 2 0
      framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java
  21. 1 0
      frontend/saas-web/app/Application.scss
  22. 1 0
      frontend/saas-web/app/util/FormUtil.js
  23. 4 2
      frontend/saas-web/app/view/main/MainController.js
  24. 10 10
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  25. 10 10
      frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js
  26. 10 10
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js
  27. 39 8
      frontend/saas-web/app/view/sale/saleOut/QueryPanel.js
  28. 91 42
      frontend/saas-web/app/view/stock/make/FormPanelController.js
  29. 10 10
      frontend/saas-web/app/view/stock/otherIn/FormPanel.js
  30. 10 5
      frontend/saas-web/app/view/sys/feedback/FormPanel.js
  31. 47 0
      frontend/saas-web/app/view/sys/feedback/FormPanel.scss

+ 2 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java

@@ -75,6 +75,8 @@ public enum BizExceptionCode implements BaseExceptionCode {
     SALEOUT_UNAUDIT_ERROR(72006,"销售订单已转出货单,无法反审核"),
     SALE_ORDER_HASAUDIT(72003, "存在已审核单据,单据编号:%s"),
     SALE_EXISTS_PURCHASE(72004, "存在已转的采购单据,单据编号:%s"),
+    SALE_ALREADY_UNAUDIT(72007, "单据状态为未审核,无法反审核"),
+    SALE_CUST_CLOSE(72008, "客户已关闭,无法审核"),
 
     //资金
     PAYBALANCE_OUTNOWBALANCE(74001,"本次核销金额不能大于未核销金额"),

+ 16 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/CommonController.java

@@ -15,7 +15,12 @@ public class CommonController {
     private CommonService commonService;
 
     @GetMapping("/{caller}/export")
-    public Result export(@PathVariable("caller") String caller){
+    public Result export(){
+        return Result.success();
+    }
+
+    @GetMapping("/{caller}/print")
+    public Result print() {
         return Result.success();
     }
 
@@ -34,4 +39,14 @@ public class CommonController {
         return deferredResult;
     }
 
+    @GetMapping("/timeout/test")
+    public void timeout(@RequestParam("time") Long time){
+        try {
+            System.out.println("进入时间:" + time);
+            Thread.sleep(time);
+            System.out.println("出去时间:" + time);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
 }

+ 6 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/VerificationController.java

@@ -120,4 +120,10 @@ public class VerificationController {
         verificationService.batchUnAudit(body);
         return Result.success();
     }
+
+    @RequestMapping("/batchDelete")
+    public Result batchDelete(@RequestBody BatchDealBaseDTO body) {
+        verificationService.batchDelete(body);
+        return Result.success();
+    }
 }

+ 5 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/VerificationService.java

@@ -83,4 +83,9 @@ public interface VerificationService {
      * @param id
      */
     void batchUnAudit(BatchDealBaseDTO baseDTO);
+
+    /**
+     * 批量删除
+     */
+    void batchDelete(BatchDealBaseDTO baseDTO);
 }

+ 6 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/RecbalanceServiceImpl.java

@@ -299,6 +299,9 @@ public class RecbalanceServiceImpl extends CommonBaseServiceImpl<RecbalanceMappe
         for (Recbalancedetail detail: recbalancedetail) {
             Subledger subledger1 = new Subledger();
             Subledger nowSubledger = subledgerMapper.selectByPrimaryKey(detail.getRbd_slid());
+            if (nowSubledger == null){
+                throw new BizException(500, BizExceptionCode.SUBLEDGER_NOT_EXIS.getMessage());
+            }
             subledger1.setId(Long.valueOf(String.valueOf(detail.getRbd_slid())));
             Double yamount = nowSubledger.getSl_yamount()==null?new Double(0):nowSubledger.getSl_yamount();
             Double namount = nowSubledger.getSl_namount()==null?new Double(0):nowSubledger.getSl_namount();
@@ -389,6 +392,9 @@ public class RecbalanceServiceImpl extends CommonBaseServiceImpl<RecbalanceMappe
         for(Recbalancedetail detail: recbalancedetail) {
             Subledger subledger1 = new Subledger();
             Subledger nowSubledger = subledgerMapper.selectByPrimaryKey(detail.getRbd_slid());
+            if (nowSubledger == null){
+                throw new BizException(500, BizExceptionCode.SUBLEDGER_NOT_EXIS.getMessage());
+            }
             subledger1.setId(Long.valueOf(String.valueOf(detail.getRbd_slid())));Double yamount = nowSubledger.getSl_yamount()==null?new Double(0):nowSubledger.getSl_yamount();
             Double namount = nowSubledger.getSl_namount()==null?new Double(0):nowSubledger.getSl_namount();
             Double nowBalance = detail.getRbd_nowbalance()==null?new Double(0):detail.getRbd_nowbalance();

+ 9 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/VerificationServiceImpl.java

@@ -954,6 +954,15 @@ public class VerificationServiceImpl extends CommonBaseServiceImpl<VerificationM
         }
     }
 
+    @Override
+    public void batchDelete(BatchDealBaseDTO baseDTO) {
+        Iterator isList = baseDTO.getBaseDTOs().iterator();
+        while (isList.hasNext()){
+            DocBaseDTO docBaseDTO = (DocBaseDTO) isList.next();
+            this.delete(docBaseDTO.getId());
+        }
+    }
+
     private String pushMaxnubmer(String code, Long id) {
         if (null == code) {
             throw new BizException(BizExceptionCode.NULL_CODE);

+ 4 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java

@@ -52,4 +52,8 @@ public interface SaleMapper extends CommonBaseMapper<Sale> {
     Integer selectPurchaseId(@Param("code") String code,@Param("companyid") Long companyid);
 
     String checkIsTurnPurchase(@Param("id") Long id,@Param("companyid") Long companyid);
+
+    Integer checkCustomer(Long id);
+
+    String validateCustAudit(List<DocBaseDTO> baseDTOs);
 }

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

@@ -247,6 +247,10 @@ public class SaleServiceImpl implements SaleService{
         sale.setSa_auditdate(new Date());
         //更新存在字段
         saleMapper.updateByPrimaryKeySelective(sale);*/
+        Integer integer = saleMapper.checkCustomer(id);
+        if (integer > 0) {
+            throw new BizException(BizExceptionCode.SALE_CUST_CLOSE);
+        }
         commonService.commonAudit("sale", "sa_id=" + id, "sa_status",
                 "sa_statuscode", "sa_auditdate", "sa_auditman");
         //更新销售金额
@@ -273,6 +277,10 @@ public class SaleServiceImpl implements SaleService{
             int code = BizExceptionCode.SALE_ORDER_HASAUDIT.getCode();
             throw new BizException(code, String.format(message, validate));
         }
+        String custAudit = saleMapper.validateCustAudit(baseDTOs.getBaseDTOs());
+        if (!StringUtils.isEmpty(custAudit)) {
+            throw new BizException(72009, "客户已关闭,无法审核, 单号:" + custAudit);
+        }
         for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
             singleAudit(base.getId());
         }
@@ -285,7 +293,7 @@ public class SaleServiceImpl implements SaleService{
         }
         String code = saleMapper.validateUnAudit(id);
         if (null != code) {
-            throw new BizException(BizExceptionCode.SALE_NULL_BILL);
+            throw new BizException(BizExceptionCode.SALE_ALREADY_UNAUDIT);
         }
         //检测出货状态为未出货
         Integer num = saleMapper.checkSendStatus(id);
@@ -322,15 +330,15 @@ public class SaleServiceImpl implements SaleService{
                 baseDTOs.getBaseDTOs().size() == 0) {
             return;
         }
-
-        String msg = saleMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
+      /*  String msg = saleMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
         if (null != msg) {
             String message = BizExceptionCode.SALE_ORDER_HASAUDIT.getMessage();
             int code = BizExceptionCode.SALE_ORDER_HASAUDIT.getCode();
             throw new BizException(code, String.format(message, msg));
         }
+        saleMapper.BatchcheckSendStatus();*/
         for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
-            singleUnAudit(base.getId());
+            unAudit(base.getId());
         }
     }
 

+ 1 - 0
applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -71,6 +71,7 @@
     <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
     <result column="pi_prstatus" jdbcType="VARCHAR" property="pi_prstatus" />
     <result column="pi_prstatuscode" jdbcType="VARCHAR" property="pi_prstatuscode" />
+    <result column="pd_ordertotal" jdbcType="DOUBLE" property="pd_ordertotal" />
   </resultMap>
 
 

+ 10 - 1
applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml

@@ -356,6 +356,13 @@
       #{item.id}
     </foreach>
   </select>
+
+  <select id="validateCustAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
+    select GROUP_CONCAT(sa_code) from sale left join customer on cu_id=sa_custid  where sa_statuscode='AUDITED' and sa_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
   <select id="validateBatchUnAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
     select GROUP_CONCAT(sa_code) from sale where sa_statuscode='UNAUDITED' and sa_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
@@ -394,7 +401,9 @@
     where pd_saleid = #{id}
     and purchasedetail.companyid= #{companyid}
   </select>
-  
+  <select id="checkCustomer" parameterType="long" resultType="integer">
+    select count(1) from sale left join  customer on sa_custid=cu_id  where  cu_statuscode='CLOSE' and cu_statuscode='CLOSE'
+  </select>
   
   <!-- 销售订单转采购单-->
   <insert id="turnPurchase" parameterType="com.usoftchina.saas.sale.dto.PurchaseDTO" >

+ 2 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java

@@ -130,6 +130,8 @@ public class ProdInOutList extends CommonBaseEntity{
 
     private String pd_remark;
 
+    private Double pd_ordertotal;
+
     private Long pd_ioid;
 
     private Date pi_auditdate;

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

@@ -11,6 +11,7 @@ import com.usoftchina.saas.auth.client.annotation.IgnoreAuth;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
@@ -18,6 +19,7 @@ import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
 import com.usoftchina.sso.api.SsoUserApi;
+import com.usoftchina.sso.dto.SsoCheckMobile;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -116,10 +118,20 @@ public class AccountController {
         Account account = null;
         // 根据手机号、邮箱、用户名片段判断是否已注册
         boolean checked = accountService.findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
+        //不存在 ——> 保存 , 存在 ——> 更新
         if (!checked) {
             account = BeanMapper.map(accountAddDTO, Account.class);
             account.setEnabled(true);
             accountService.save(account);
+        }else{
+            Account accountTemp = accountService.findByMobile(accountAddDTO.getMobile());
+            if (accountTemp == null){
+                accountTemp = accountService.findByEmail(accountAddDTO.getEmail());
+            }
+            account = BeanMapper.map(accountAddDTO, Account.class);
+            account.setEnabled(true);
+            account.setId(accountTemp.getId());
+            accountService.updateByPrimaryKeySelective(account);
         }
         account = accountService.findByMobile(accountAddDTO.getMobile());
         //绑定企业
@@ -137,7 +149,20 @@ public class AccountController {
      */
     @GetMapping("/checkMobile")
     public Result checkMobile(@RequestParam("mobile") String mobile){
-        return Result.success(ssoUserApi.checkMobile(mobile));
+        SsoCheckMobile ssoCheckMobile = ssoUserApi.checkMobile(mobile);
+        Long companyId = BaseContextHolder.getCompanyId();
+        if (ssoCheckMobile.isHasRegister()){
+            Account account = accountService.findByMobile(mobile);
+            if (account != null){
+                List<CompanyBaseVO> companyBaseVOList = companyService.findBaseByAccountId(account.getId());
+                for (CompanyBaseVO companyBaseVO : companyBaseVOList){
+                    if (companyBaseVO.getId().equals(companyId)){
+                        throw new BizException(ExceptionCode.USER_COMPANY_EXIST);
+                    }
+                }
+            }
+        }
+        return Result.success(ssoCheckMobile);
     }
 
     @GetMapping("/checkEmail")
@@ -396,6 +421,8 @@ public class AccountController {
     @PostMapping("/disable")
     public Result disableAccount(@RequestParam long accountId) {
         accountService.disable(accountId);
+        //移除账户绑定的企业关系
+        accountService.unbindCompany(accountId, BaseContextHolder.getCompanyId());
         //同步到优软云
         Long userUU = accountService.findByPrimaryKey(accountId).getUu();
         Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
@@ -413,10 +440,12 @@ public class AccountController {
     @PostMapping("/enable")
     public Result enableAccount(@RequestParam long accountId) {
         accountService.enable(accountId);
+        //添加账户绑定的企业关系
+        accountService.bindCompany(accountId, BaseContextHolder.getCompanyId());
         //同步到优软云
-//        Long userUU = accountService.findByPrimaryKey(accountId).getUu();
-//        Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
-//        String result = ssoUserApi.bind("bind", "trade-app", userUU, companyUU);
+        Long userUU = accountService.findByPrimaryKey(accountId).getUu();
+        Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
+        String result = ssoUserApi.bind("bind", "trade-app", userUU, companyUU);
         accountService.clearCache(accountId);
         return Result.success();
     }

+ 7 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleMapper.java

@@ -19,4 +19,11 @@ public interface RoleMapper extends CommonBaseMapper<Role> {
      * @return
      */
     List<Role> selectByAccountId(@Param("accountId") long accountId);
+
+    /**
+     * 查找公司管理员角色
+     * @param companyId
+     * @return
+     */
+    Role findManagerByCompanyId(@Param("companyId") Long companyId);
 }

+ 7 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java

@@ -52,4 +52,11 @@ public interface RoleService extends CommonBaseService<RoleMapper, Role> {
      * @return
      */
     boolean saveRoleResource(PowerSetListDTO powerSetListDTO);
+
+    /**
+     *
+     * @param companyId
+     * @return
+     */
+    Role findManagerByCompanyId(Long companyId);
 }

+ 13 - 2
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java

@@ -4,12 +4,15 @@ import com.usoftchina.saas.account.dto.*;
 import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
 import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.po.Company;
+import com.usoftchina.saas.account.po.Role;
 import com.usoftchina.saas.account.service.AccountCenterService;
 import com.usoftchina.saas.account.service.AccountService;
 import com.usoftchina.saas.account.service.CompanyService;
+import com.usoftchina.saas.account.service.RoleService;
 import com.usoftchina.saas.auth.api.AuthApi;
 import com.usoftchina.saas.auth.dto.TokenDTO;
 import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.StringUtils;
@@ -38,6 +41,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
     @Autowired
     private AccountService accountService;
     @Autowired
+    private RoleService roleService;
+    @Autowired
     private SsoUserApi ssoUserApi;
     @Autowired
     private SsoUserSpaceApi ssoUserSpaceApi;
@@ -57,7 +62,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         //a. 判断是否已注册
         Company company = companyService.findByName(companyRegDTO.getName());
         if (null != company) {
-            return Result.error(ExceptionCode.COMPANY_NAME_EXIST);
+            Account account = accountService.findByPrimaryKey(company.getCreatorId());
+            throw new BizException(ExceptionCode.COMPANY_CODE_EXIST.getCode(), String.format(ExceptionCode.COMPANY_NAME_HASREGISTER.getMessage(), account.getRealname()+"("+account.getMobile()+")"));
         }
         company = companyService.findByBusinessCode(companyRegDTO.getBusinessCode());
         if (null != company) {
@@ -89,6 +95,11 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         map.put("result", null);
         accountCompanyMapper.initData(map);
 
+        //账户绑定角色    默认管理员
+        Role role = roleService.findManagerByCompanyId(company.getId());
+        if (role != null) {
+            accountService.bindRole(accountId, role.getId());
+        }
         return Result.success();
     }
 
@@ -153,7 +164,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                         false,
                         false,
                         ssoUserSpace.getSpaceUU().toString(),
-                        ssoUserSpace.getAdmin().getVipName(),
+                        ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getVipName() : null,
                         0L,
                         ssoUserSpace.getProfession()
                 );

+ 5 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java

@@ -166,6 +166,11 @@ public class RoleServiceImpl extends CommonBaseServiceImpl<RoleMapper, Role> imp
         return true;
     }
 
+    @Override
+    public Role findManagerByCompanyId(Long companyId) {
+        return getMapper().findManagerByCompanyId(companyId);
+    }
+
     /**
      * 设置其他默认权限,用于生成设置按钮
      * @param powerDTO

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml

@@ -104,4 +104,7 @@
         select <include refid="baseColumns"/> from ac_role,ac_account_role
         where ac_role.id=ac_account_role.role_id and ac_account_role.account_id=#{accountId,jdbcType=BIGINT}
     </select>
+    <select id="findManagerByCompanyId" parameterType="int" resultType="com.usoftchina.saas.account.po.Role">
+        SELECT * FROM AC_ROLE WHERE COMPANY_ID = #{companyId} AND TYPE = 0 limit 1
+    </select>
 </mapper>

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

@@ -8,10 +8,7 @@ import com.usoftchina.sso.dto.SsoUser;
 import com.usoftchina.sso.dto.SsoUserSpaceList;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author yingp
@@ -57,9 +54,20 @@ public interface SsoUserApi {
      * @param spaceUU
      * @return
      */
-    @PostMapping("")
+    @RequestMapping(params = "_operate=unbind", method = RequestMethod.POST)
     String unbind(@RequestParam("_operate") String _operate, @RequestParam("userUU") Long userUU, @RequestParam("spaceUU") Long spaceUU);
 
+    /**
+     * 绑定用户和企业
+     * @param _operate
+     * @param appId
+     * @param userUU
+     * @param spaceUU
+     * @return
+     */
+    @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);
+
     @Component
     class DefaultFallback implements SsoUserApi{
         @Override
@@ -82,5 +90,10 @@ public interface SsoUserApi {
             return null;
         }
 
+        @Override
+        public String bind(String _operate, String appId, Long userUU, Long spaceUU) {
+            return null;
+        }
+
     }
 }

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

@@ -62,4 +62,11 @@ public class SsoUserApiTest {
         System.out.println(result);
     }
 
+    @Test
+    public void testF_bind(){
+        Long companyUU = 10050435l;
+        Long userUU = 1000027276l;
+        String result = ssoUserApi.bind("bind","trade-app", userUU, companyUU);
+        System.out.println(result);
+    }
 }

+ 2 - 0
framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java

@@ -30,6 +30,7 @@ public enum ExceptionCode implements BaseExceptionCode {
 
     // 账户管理相关
     COMPANY_NAME_EXIST(52000, "公司名称已注册"),
+    COMPANY_NAME_HASREGISTER(52000, "企业已开通saas,请联系管理员 %s 将您添加至企业"),
     COMPANY_CODE_EXIST(52001, "公司商业登记证号已注册"),
     COMPANY_DOMAIN_EXIST(52002, "域名已存在"),
     COMPANY_NOT_EXIST(52003, "公司不存在"),
@@ -43,6 +44,7 @@ public enum ExceptionCode implements BaseExceptionCode {
     USER_NOT_ENABLE(53006, "用户禁止使用"),
     ROLE_NOT_EXIST(53020, "角色不存在"),
     MISSING_PERMISSIONS(53030, "权限缺失"),
+    USER_COMPANY_EXIST(53007, "企业已存在账户"),
 
     // 文件相关
     FOLDER_NOT_EXISTS(55000, "文件夹不存在"),

+ 1 - 0
frontend/saas-web/app/Application.scss

@@ -187,6 +187,7 @@ body.launching {
 
 .x-btn-default-small,
 .x-btn-default-toolbar-small{
+  min-width: 86px !important;
   border-radius: 2px !important;
 }
 

+ 1 - 0
frontend/saas-web/app/util/FormUtil.js

@@ -225,6 +225,7 @@ Ext.define('saas.util.FormUtil', {
                 .catch(function(response) {
                     form.setLoading(false);
                     console.error(response);
+                    saas.util.BaseUtil.showErrorToast(response.message);
                 });
             }else{
                 //取后台编号

+ 4 - 2
frontend/saas-web/app/view/main/MainController.js

@@ -94,9 +94,11 @@ Ext.define('saas.view.main.MainController', {
         if (!win) {
              win = Ext.create('Ext.window.Window', {
                 modal: true,
+                draggable: false,
+                resizable: false,
                 id:"feedbackWin",
-                height: '50%',
-                width: '70%',
+                height: 343,
+                width: 756,
                 title: '意见反馈',
                 scrollable: true,
                 constrain: true,

+ 10 - 10
frontend/saas-web/app/view/purchase/purchase/FormPanel.js

@@ -240,11 +240,11 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -264,11 +264,11 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_taxtotal", 
                 width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 10 - 10
frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js

@@ -268,11 +268,11 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -292,11 +292,11 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 10 - 10
frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js

@@ -255,11 +255,11 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -279,11 +279,11 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 39 - 8
frontend/saas-web/app/view/sale/saleOut/QueryPanel.js

@@ -152,9 +152,13 @@ Ext.define('saas.view.sale.saleout.QueryPanel', {
             width: 90
         }, {
             text: '明细序号',
-            dataIndex: 'pd_detno',
+            dataIndex: 'pd_pdno',
             xtype: 'numbercolumn',
-            width: 100
+            width: 100,
+            renderer : function(v) {
+                var format = '0'
+                return Ext.util.Format.number(v, format);
+            }
         }, {
             text: '关联销售单号',
             dataIndex: 'pd_ordercode',
@@ -180,27 +184,54 @@ Ext.define('saas.view.sale.saleout.QueryPanel', {
             text: '出货数量',
             dataIndex: 'pd_outqty',
             xtype:'numbercolumn',
-            width: 110
+            width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         }, {
             text: '销售单价',
             dataIndex: 'pd_sendprice',
             xtype:'numbercolumn',
-            width: 110
+            width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
+                var format = '0.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         }, {
             text: '金额',
-            dataIndex: 'pd_total',
+            dataIndex: 'pd_ordertotal',
             xtype:'numbercolumn',
-            width: 110
+            width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         }, {
             text: '税率',
             dataIndex: 'pd_taxrate',
             xtype:'numbercolumn',
-            width: 80
+            width: 80,
+            renderer : function(v) {
+                return Ext.util.Format.number(v, '0');
+            }
         }, {
             text: '成本单价',
             dataIndex: 'pd_price',
             xtype:'numbercolumn',
-            width: 110
+            width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                var format = '0.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         }, {
             text: '备注',
             dataIndex: 'pd_remark',

+ 91 - 42
frontend/saas-web/app/view/stock/make/FormPanelController.js

@@ -79,8 +79,59 @@ Ext.define('saas.view.stock.make.FormPanelController', {
 
         });
     },
+    initCopyData: function(formData) {
+        var me = this;
+        var form = this.getView();
+        var detailCount = form.detailCount;
+        var main = formData.main;
+        var auditTexts = form.auditTexts;
+
+        // 单号、id清空
+        main[form._idField] = 0;
+        main[form._codeField] = '';
+        // 单据状态为录入状态(未审核)
+        main[form._statusCodeField] = auditTexts.unAuditCode;
+        main[form._statusField] = auditTexts.unAuditText;
+        //录入人,录入日期,审核人,审核日期清空
+        main['creatorId'] = null;
+        main['creatorName'] = null;
+        main['createTime'] = null;
+        main['updaterId'] = null;
+        main['updaterName'] = null;
+        main['updateTime'] = null;
+        main[form._auditmanField] = null;
+        main[form._auditdateField] = null;
+        //数量,单价,金额(主表)
+        main['ma_qty'] = 0;
+        main['ma_price'] = 0;
+        main['ma_total'] = 0;
+        for(var k in main) {
+            // 主表日期改为当前日期
+            if(saas.util.BaseUtil.isDateString(main[k])) {
+                main[k] = Ext.Date.format(new Date, 'Y-m-d H:i:s');
+            }
+        }
 
+        for(var j = 0; j < detailCount; j++) {
+            var detail = formData['detail' + j];
+            for(var x = 0; x < detail.length; x ++) {
+                var d = detail[x];
 
+                for(var k in d) {
+                    // 从表id清空
+                    delete d['id'];
+                    delete d['mm_price'];
+                    delete d['mm_qty'];
+                    delete d['mm_amount'];
+                    // 从表日期清空
+                    if(saas.util.BaseUtil.isDateString(d[k])) {
+                        d[k] = '';
+                    }
+                }
+            }
+        }
+        return me.myInitCopyData(formData);;
+    },
     price_change:function(v) {
         var me = this,
         viewModel = me.getViewModel(),
@@ -90,47 +141,45 @@ Ext.define('saas.view.stock.make.FormPanelController', {
             saas.util.BaseUtil.showErrorToast('成本单价为0!');
         }
     },
+    getBomData: function(v) {
+    var me = this,
+    form = me.getView(),
+    viewModel = me.getViewModel(),
+    store = viewModel.get('detail0').detailStore,
+    type = viewModel.get('ma_type'),
+    loadData = new Array();
 
-
-     getBomData: function(v) {
-        var me = this,
-        form = me.getView(),
-        viewModel = me.getViewModel(),
-        store = viewModel.get('detail0').detailStore,
-        type = viewModel.get('ma_type'),
-        loadData = new Array();
-
-        //请求bom资料
-        saas.util.BaseUtil.request({
-            url: form._getBomUrl+'/'+v,
-            method: 'GET',
-        })
-        .then(function(localJson) {
-            if(localJson.success){
-                var data = localJson.data.items;
-                Ext.Array.each(data, function(item, i) {
-                    loadData.push({
-                        mm_detno:item.bd_detno,
-                        mm_prodid:item.productDTO.id,
-                        mm_prodcode:item.productDTO.pr_code,
-                        mm_oneuseqty:item.bd_baseqty,
-                        pr_detail:item.productDTO.pr_detail,
-                        pr_spec:item.productDTO.pr_spec,
-                        pr_unit:item.productDTO.pr_unit,
-                        mm_repprodcode:item.bd_replace,
-                        mm_remark:item.bd_remark,                        
-                        mm_whid:item.productDTO.pr_whid,                        
-                        mm_whcode:item.productDTO.pr_whcode,
-                        mm_whname:item.productDTO.pr_whname,
-                        mm_price:type=='拆件'?item.productDTO.pr_purcprice:null
-                    })                
-                });
-                store.loadData(loadData);
-            }
-        })
-        .catch(function(res) {
-            console.error(res);
-            saas.util.BaseUtil.showErrorToast('获取BOM资料失败: ' + res.message);
-        });
-     }
+    //请求bom资料
+    saas.util.BaseUtil.request({
+        url: form._getBomUrl+'/'+v,
+        method: 'GET',
+    })
+    .then(function(localJson) {
+        if(localJson.success){
+            var data = localJson.data.items;
+            Ext.Array.each(data, function(item, i) {
+                loadData.push({
+                    mm_detno:item.bd_detno,
+                    mm_prodid:item.productDTO.id,
+                    mm_prodcode:item.productDTO.pr_code,
+                    mm_oneuseqty:item.bd_baseqty,
+                    pr_detail:item.productDTO.pr_detail,
+                    pr_spec:item.productDTO.pr_spec,
+                    pr_unit:item.productDTO.pr_unit,
+                    mm_repprodcode:item.bd_replace,
+                    mm_remark:item.bd_remark,                        
+                    mm_whid:item.productDTO.pr_whid,                        
+                    mm_whcode:item.productDTO.pr_whcode,
+                    mm_whname:item.productDTO.pr_whname,
+                    mm_price:type=='拆件'?item.productDTO.pr_purcprice:null
+                })                
+            });
+            store.loadData(loadData);
+        }
+    })
+    .catch(function(res) {
+        console.error(res);
+        saas.util.BaseUtil.showErrorToast('获取BOM资料失败: ' + res.message);
+    });
+    }
 });

+ 10 - 10
frontend/saas-web/app/view/stock/otherIn/FormPanel.js

@@ -233,11 +233,11 @@ Ext.define('saas.view.stock.otherIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable:false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable:false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -271,11 +271,11 @@ Ext.define('saas.view.stock.otherIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable:false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable:false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 10 - 5
frontend/saas-web/app/view/sys/feedback/FormPanel.js

@@ -1,5 +1,5 @@
 Ext.define('saas.view.sys.feedback.FormPanel', {
-    extend: 'Ext.panel.Panel',
+    extend: 'Ext.form.Panel',
     xtype: 'sys-feedback-formpanel',
 
     controller: 'sys-feedback-formpanel',
@@ -12,12 +12,12 @@ Ext.define('saas.view.sys.feedback.FormPanel', {
     autoScroll: true,
 
     fieldDefaults: {
-        margin: '0 0 10 0',
+        margin: '0 0 16 0',
         labelAlign: 'right',
         labelWidth: 70,
         columnWidth: 0.5,
     },
-    bodyPadding: 10,
+    bodyPadding: '0 30 0 30',
     border: false,
     initComponent: function () {
         var me = this;
@@ -47,16 +47,21 @@ Ext.define('saas.view.sys.feedback.FormPanel', {
             name : "fb_wechat", 
             fieldLabel : "微信"
         }, {
-            xtype : "textfield", 
+            xtype : "textareafield", 
             name : "fb_msg", 
             fieldLabel : "反馈内容",
-            columnWidth: 1
+            columnWidth: 1,
+            height: 63,
+            maxHeight: 63
         }];
+        me.buttonAlign = 'center';
         me.buttons = [{
             text: '提交',
+            margin: '0 20 0 20',
             handler:'onSubmit'
         },{
             text: '关闭',
+            margin: '0 20 0 20',
             handler:'onClose'
         }];
         me.callParent(arguments);

+ 47 - 0
frontend/saas-web/app/view/sys/feedback/FormPanel.scss

@@ -0,0 +1,47 @@
+#feedbackWin {
+    border: none;
+    border-radius: 4px;
+
+    .x-window-header {
+        padding: 30px 45px 20px 45px;
+        background: #fff;
+        border: none;
+
+        .x-window-header-title-default {
+            .x-title-text {
+                color: #34BAF6;
+                font-size: 16px;
+                font-weight: 500;
+                letter-spacing: 1.8px;
+                padding-left: 10px;
+
+                &:before {
+                    content: ' ';
+                    position: absolute;
+                    width: 5px;
+                    height: 16px;
+                    background: #34baf6;
+                    left: 0;
+                    top: 2px;
+                    border-radius: 4px;
+                }
+            }
+        }
+
+        .x-tool-default {
+            
+            .x-tool-close {
+                color:  #34BAF6;
+            }
+        }
+    }
+
+    .x-window-bodyWrap {
+        
+        .x-toolbar-footer {
+            padding: 0;
+            top: 210px !important;
+            background: #fff;
+        }
+    }
+}