Browse Source

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

guq 6 năm trước cách đây
mục cha
commit
63d1016cac
50 tập tin đã thay đổi với 1377 bổ sung609 xóa
  1. 5 0
      applications/commons/commons-api/pom.xml
  2. 18 0
      applications/commons/commons-api/src/main/java/com/usoftchina/saas/commons/api/ConfigsApi.java
  3. 99 0
      applications/commons/commons-api/src/main/java/com/usoftchina/saas/commons/cache/ConfigsCache.java
  4. 1 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  5. 5 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ConfigsController.java
  6. 2 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/ConfigsService.java
  7. 5 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ConfigsServiceImpl.java
  8. 14 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java
  9. 13 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java
  10. 31 0
      applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseApi.java
  11. 0 15
      applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseService.java
  12. 5 0
      applications/purchase/purchase-server/pom.xml
  13. 12 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java
  14. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Purchase.java
  15. 7 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java
  16. 47 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  17. 5 1
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml
  18. 3 3
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  19. 28 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/api/B2BPurchaseApi.java
  20. 302 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/Purchase.java
  21. 313 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/PurchaseDetail.java
  22. 22 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/SavePurchaseListReq.java
  23. 22 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/SavePurchaseListResp.java
  24. 4 0
      applications/transfers/transfers-server/pom.xml
  25. 1 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/service/ReceiveService.java
  26. 1 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendProductTask.java
  27. 40 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseTask.java
  28. 9 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRegDTO.java
  29. 3 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java
  30. 2 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java
  31. 7 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  32. 1 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java
  33. 2 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java
  34. 3 3
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  35. 3 2
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserSpaceApi.java
  36. 5 3
      base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserSpaceApiTeest.java
  37. 15 7
      frontend/saas-portal-web/src/components/conenter/home.vue
  38. 1 1
      frontend/saas-portal-web/src/components/conenter/problem.vue
  39. 5 2
      frontend/saas-portal-web/src/components/footer/footer.vue
  40. 6 5
      frontend/saas-web/app/view/core/base/BasePanel.js
  41. 36 31
      frontend/saas-web/app/view/core/base/GridPanel.js
  42. 1 1
      frontend/saas-web/app/view/money/othreceipts/FormPanel.js
  43. 6 0
      frontend/saas-web/app/view/money/othreceipts/FormPanelController.js
  44. 1 1
      frontend/saas-web/app/view/money/othspendings/FormPanel.js
  45. 6 0
      frontend/saas-web/app/view/money/othspendings/FormPanelController.js
  46. 64 6
      frontend/saas-web/app/view/sale/business/Business.js
  47. 97 79
      frontend/saas-web/app/view/sale/business/Product.js
  48. 92 431
      frontend/saas-web/app/view/sys/maxnumbers/DataList.js
  49. 0 5
      frontend/saas-web/app/view/sys/maxnumbers/DataListController.js
  50. 5 0
      frontend/saas-web/resources/json/navigation.json

+ 5 - 0
applications/commons/commons-api/pom.xml

@@ -32,5 +32,10 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>auth-client</artifactId>
         </dependency>
+      <dependency>
+        <groupId>org.springframework.data</groupId>
+        <artifactId>spring-data-redis</artifactId>
+        <version>RELEASE</version>
+      </dependency>
     </dependencies>
 </project>

+ 18 - 0
applications/commons/commons-api/src/main/java/com/usoftchina/saas/commons/api/ConfigsApi.java

@@ -0,0 +1,18 @@
+package com.usoftchina.saas.commons.api;
+
+import com.usoftchina.saas.auth.client.interceptor.ServiceFeignInterceptor;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.po.Configs;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.util.List;
+
+@FeignClient(name = "commons-server", configuration = ServiceFeignInterceptor.class)
+public interface ConfigsApi {
+
+    @GetMapping("/configs/list/{companyId}")
+    Result<List<Configs>> getConfigsByCompanyId(@PathVariable("companyId") Long companyId);
+
+}

+ 99 - 0
applications/commons/commons-api/src/main/java/com/usoftchina/saas/commons/cache/ConfigsCache.java

@@ -0,0 +1,99 @@
+package com.usoftchina.saas.commons.cache;
+
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.cache.RedisHashCache;
+import com.usoftchina.saas.commons.api.ConfigsApi;
+import com.usoftchina.saas.commons.po.Configs;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.context.SpringContextHolder;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.utils.JsonUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Supplier;
+
+/**
+ * @Description 系统参数配置
+ * @Author chenwei
+ * @Date 2019/01/14
+ */
+public class ConfigsCache extends RedisHashCache<String, String, String> {
+
+    /**
+     * 企业ID
+     */
+    private Long id;
+
+    @Autowired
+    private ConfigsApi configsApi;
+
+    private static final RedisTemplate<String, String> REDIS_TEMPLATE = SpringContextHolder.getBean("redisTemplate", RedisTemplate.class);
+
+    public ConfigsCache() {
+        super(() -> REDIS_TEMPLATE);
+    }
+
+    public static ConfigsCache of(Long id){
+        ConfigsCache cache = new ConfigsCache();
+        cache.id = id;
+        return cache;
+    }
+
+    /**
+     * 当前企业的缓存信息
+     *
+     * @return
+     */
+    public static ConfigsCache current() {
+        return of(BaseContextHolder.getCompanyId());
+    }
+
+    @Override
+    protected String field() {
+        return String.valueOf("companyId:" + id);
+    }
+
+    @Override
+    protected String key() {
+        return generatePublicKey("common", "configs");
+    }
+
+    @Override
+    protected Supplier<String> getSupplier() {
+        return () -> {
+            if (null == configsApi) {
+                configsApi = SpringContextHolder.getBean(ConfigsApi.class);
+            }
+            Result<List<Configs>> result = null;
+            if (null != id && id > 0) {
+                result = configsApi.getConfigsByCompanyId(id);
+            } else {
+                return null;
+            }
+            if (result.isSuccess()) {
+                return JsonUtils.toJsonString(result.getData());
+            }
+            throw new BizException(result.getCode(), result.getMessage());
+        };
+    }
+
+    public List<Configs> getConfigs(){
+        Optional<String> value = get();
+        if (value.isPresent()){
+            return JsonUtils.fromJsonArray(value.get(), Configs.class);
+        }
+        return null;
+    }
+
+    /**
+     * 是否启用B2B
+     * @return
+     */
+    public boolean enableB2B(){
+        return getConfigs().stream().filter(configs -> "enableB2B".equals(configs.getCode()) && "1".equals(configs.getData())).count() > 0;
+    }
+}

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

@@ -80,7 +80,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     PURCHASE_DETAIL_OVERNUM(70001, "明细行数量超过来源采购验收单明细行数量"),
     PURCHASE_ORDER_HASAUDIT(70002, "存在已审核单据,单据编号:%s"),
     PURCHASE_ORDER_HASUNAUDIT(70003, "存在未审核单据,单据编号:%s"),
-
+    PURCHASE_ORDER_HASUPLOAD(70004, "采购单已上传B2B,不允许反审核"),
 
 
     //销售

+ 5 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ConfigsController.java

@@ -29,6 +29,11 @@ public class ConfigsController {
         return Result.success(listData);
     }
 
+    @GetMapping("/list/{companyId}")
+    public Result<List<Configs>> getListByConmapyId(@PathVariable("companyId") Long companyId){
+        return Result.success(configsService.getListByConmapyId(companyId));
+    }
+
     @GetMapping("/getConfigByCode")
     public Result<Configs> getConfigByCode(String code) {
         Configs data = configsService.getConfigByCode(code);

+ 2 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/ConfigsService.java

@@ -16,4 +16,6 @@ public interface ConfigsService {
     DocBaseDTO save(Configs data);
 
     void update(List<Configs> data);
+
+    List<Configs> getListByConmapyId(Long companyId);
 }

+ 5 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ConfigsServiceImpl.java

@@ -45,6 +45,11 @@ public class ConfigsServiceImpl implements ConfigsService{
         return pageInfo;
     }
 
+    @Override
+    public List<Configs> getListByConmapyId(Long companyId){
+        return configsMapper.selectByCondition(null, companyId);
+    }
+
     @Override
     public Configs getConfigByCode(String code) {
         if (StringUtils.isEmpty(code)) {

+ 14 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.document.controller;
 
 import com.github.pagehelper.PageInfo;
+import com.netflix.discovery.converters.Auto;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.ComboDTO;
@@ -9,6 +10,7 @@ import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.document.dto.CustomerFormDTO;
 import com.usoftchina.saas.document.entities.CustomerList;
 import com.usoftchina.saas.document.service.CustomerService;
+import com.usoftchina.saas.inquiry.api.SearchUUApi;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -25,6 +27,8 @@ public class CustomerController {
 
     @Autowired
     private CustomerService customerService;
+    @Autowired
+    private SearchUUApi searchUUApi;
 
     /**
      * 客户资料列表
@@ -180,4 +184,14 @@ public class CustomerController {
         customerService.saveToFormal(id, update);
         return Result.success();
     }
+
+    /**
+     * 获取客户UU
+     * @param name
+     * @return
+     */
+    @GetMapping("/getCustomerUU")
+    public Result getVendorUU(@RequestParam("name") String name){
+        return Result.success(searchUUApi.queryEnterprises(name));
+    }
 }

+ 13 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java

@@ -10,6 +10,7 @@ import com.usoftchina.saas.document.dto.VendorDTO;
 import com.usoftchina.saas.document.dto.VendorListDTO;
 import com.usoftchina.saas.document.entities.VendorList;
 import com.usoftchina.saas.document.service.VendorService;
+import com.usoftchina.saas.inquiry.api.SearchUUApi;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -22,6 +23,8 @@ public class VendorController {
 
     @Autowired
     private VendorService vendorService;
+    @Autowired
+    private SearchUUApi searchUUApi;
 
     /**
      * 获取供应商信息
@@ -141,4 +144,14 @@ public class VendorController {
         return Result.success();
     }
 
+    /**
+     * 获取供应商UU
+     * @param name
+     * @return
+     */
+    @GetMapping("/getVendorUU")
+    public Result getVendorUU(@RequestParam("name") String name){
+        return Result.success(searchUUApi.queryEnterprises(name));
+    }
+
 }

+ 31 - 0
applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseApi.java

@@ -0,0 +1,31 @@
+package com.usoftchina.saas.purchase.api;
+
+import com.usoftchina.saas.auth.client.interceptor.ServiceFeignInterceptor;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
+import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+@FeignClient(name = "purchase-server", configuration = ServiceFeignInterceptor.class)
+public interface PurchaseApi {
+
+    @PostMapping("/purchase/getPurchaseCode")
+    String getPurchaseCode(@RequestBody DocBaseDTO baseDTO);
+
+    /**
+     * 获取采购单数据
+     * @param id
+     * @return
+     */
+    @GetMapping("/purchase/read/{id}")
+    Result<PurchaseFormDTO> getFormData(@PathVariable("id") Long id);
+    /**
+     * 更新采购单B2B上传状态
+     * @param id
+     * @param status
+     * @return
+     */
+    @PostMapping("/b2bStatus/update")
+    Result updateB2BStatus(@RequestParam("id") Long id, @RequestParam("status") String status);
+}

+ 0 - 15
applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseService.java

@@ -1,15 +0,0 @@
-package com.usoftchina.saas.purchase.api;
-
-import com.usoftchina.saas.auth.client.interceptor.ServiceFeignInterceptor;
-import com.usoftchina.saas.commons.dto.DocBaseDTO;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-@FeignClient(name = "purchase-server", configuration = ServiceFeignInterceptor.class)
-public interface PurchaseService {
-
-    @PostMapping("/purchase/getPurchaseCode")
-    public String getPurchaseCode(@RequestBody DocBaseDTO baseDTO);
-
-}

+ 5 - 0
applications/purchase/purchase-server/pom.xml

@@ -34,6 +34,11 @@
             <artifactId>mall-api</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>transfers-api</artifactId>
+          <version>1.0.0-SNAPSHOT</version>
+        </dependency>
 
         <!--test-->
         <dependency>

+ 12 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java

@@ -223,4 +223,16 @@ public class PurchaseController {
         List<InquiryAddDTO> inquiryAddDTOList = JsonUtils.fromJsonArray(data, InquiryAddDTO.class);
         return Result.success(purchaseService.saveInquiry(inquiryAddDTOList));
     }
+
+    /**
+     * 更新采购单B2B上传状态
+     * @param id
+     * @param status
+     * @return
+     */
+    @PostMapping("/b2bStatus/update")
+    public Result updateB2BStatus(@RequestParam("id") Long id, @RequestParam("status") String status){
+        purchaseService.updateB2BStatus(id, status);
+        return Result.success();
+    }
 }

+ 2 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Purchase.java

@@ -70,4 +70,6 @@ public class Purchase extends CommonBaseEntity implements Serializable {
     private String pu_currency;
 
     private Double pu_rate;
+
+    private String b2bStatus;
 }

+ 7 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java

@@ -166,4 +166,11 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
      * @param inquiryAddDTO
      */
     List<Map<String, String>> saveInquiry(List<InquiryAddDTO> inquiryAddDTO);
+
+    /**
+     * 更新采购单对接B2B上传状态
+     * @param id
+     * @param status
+     */
+    void updateB2BStatus(Long id, String status);
 }

+ 47 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.purchase.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.commons.cache.ConfigsCache;
 import com.usoftchina.saas.inquiry.api.InquiryApi;
 import com.usoftchina.saas.inquiry.api.SearchApi;
 import com.usoftchina.saas.inquiry.po.inquiry.*;
@@ -36,6 +37,8 @@ import com.usoftchina.saas.purchase.mapper.*;
 import com.usoftchina.saas.purchase.po.*;
 import com.usoftchina.saas.purchase.service.ProdInOutService;
 import com.usoftchina.saas.purchase.service.PurchaseService;
+import com.usoftchina.saas.transfers.api.SendMessageApi;
+import com.usoftchina.saas.transfers.dto.MessageInfo;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.JsonUtils;
@@ -84,6 +87,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
     private CompanyApi companyApi;
     @Autowired
     private AccountApi accountApi;
+    @Autowired
+    private SendMessageApi sendMessageApi;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(PurchaseServiceImpl.class);
 
@@ -189,6 +194,10 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             calcPurchase(pu_id);
             //日志记录
             messageLogService.save(baseDTO);
+
+            //上传至B2B
+            uploadB2B(pu_id);
+
             return baseDTO;
         }
         //校验有来源的验收验退币别是否与源单据一致
@@ -233,6 +242,37 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         return baseDTO;
     }
 
+    /**
+     * 上传至B2B
+     * @param id
+     */
+    private void uploadB2B(Long id) {
+        Long userId = BaseContextHolder.getUserId();
+        Long companyId = BaseContextHolder.getCompanyId();
+        //是否启用B2B
+        boolean enable = ConfigsCache.current().enableB2B();
+        if (enable) {
+            //更新上传状态
+            updateB2BStatus(id, "待上传");
+            //生成消息
+            MessageInfo messageInfo = new MessageInfo(userId, BillCodeSeq.PURCHASE.name(), String.valueOf(id), companyId);
+            sendMessageApi.sendMsg(messageInfo);
+        }
+    }
+
+    /**
+     * 更新采购案B2B上传状态
+     * @param id
+     * @param status
+     */
+    @Override
+    public void updateB2BStatus(Long id, String status){
+        Purchase purchase = new Purchase();
+        purchase.setId(id);
+        purchase.setB2bStatus(status);
+        getMapper().updateByPrimaryKeySelective(purchase);
+    }
+
 
     @Override
     @Transactional
@@ -298,6 +338,13 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
 
     @Override
     public void unAudit(Long id) {
+        boolean enable = ConfigsCache.current().enableB2B();
+        if (enable){
+            Purchase purchase = purchaseMapper.selectByPrimaryKey(id);
+            if ("已上传".equals(purchase.getB2bStatus())){
+                throw new BizException(BizExceptionCode.PURCHASE_ORDER_HASUPLOAD);
+            }
+        }
         if (null == id) {
             return;
         }

+ 5 - 1
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml

@@ -38,6 +38,7 @@
     <result column="pu_text5" property="pu_text5" jdbcType="VARCHAR" />
     <result column="pu_currency" property="pu_currency" jdbcType="VARCHAR" />
     <result column="pu_rate" property="pu_rate" jdbcType="DOUBLE" />
+    <result column="b2bStatus" property="b2bStatus" jdbcType="VARCHAR" />
   </resultMap>
  <resultMap id="ResultMapWithBLOBs" type="com.usoftchina.saas.purchase.po.Purchase" extends="BaseResultMap" >
     <result column="PU_SHIPADDRESSCODE" property="pu_shipaddresscode" jdbcType="LONGVARCHAR" />
@@ -48,7 +49,7 @@
     PU_BUYERNAME, PU_DELIVERY, PU_TAXTOTAL, PU_TOTAL, PU_REMARK, PU_TOTALUPPER,
     PU_PRINTSTATUS, PU_PRINTSTATUSCODE, PU_ACCEPTSTATUSCODE, PU_ACCEPTSTATUS, PU_STATUSCODE, 
     PU_STATUS, companyid, updaterId,updaterName,updateTime,creatorid,creatorName,createtime, pu_text1, pu_text2, pu_text3, pu_text4,
-    pu_text5,pu_auditman,pu_auditdate,pu_currency,pu_rate
+    pu_text5,pu_auditman,pu_auditdate,pu_currency,pu_rate,b2bStatus
   </sql>
   <sql id="Blob_Column_List" >
     PU_SHIPADDRESSCODE
@@ -382,6 +383,9 @@
       <if test="pu_rate != null" >
         pu_rate = #{pu_rate,jdbcType=DOUBLE},
       </if>
+      <if test="b2bStatus != null">
+        b2bStatus = #{b2bStatus,jdbcType=DOUBLE}
+      </if>
     </set>
     where pu_id = #{id,jdbcType=INTEGER}
   </update>

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

@@ -21,7 +21,7 @@ import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
-import com.usoftchina.saas.purchase.api.PurchaseService;
+import com.usoftchina.saas.purchase.api.PurchaseApi;
 import com.usoftchina.saas.sale.dto.*;
 import com.usoftchina.saas.sale.mapper.*;
 import com.usoftchina.saas.sale.po.Sale;
@@ -68,7 +68,7 @@ public class SaleServiceImpl implements SaleService{
     @Autowired
     private CommonService commonService;
     @Autowired
-    private PurchaseService purchaseService;
+    private PurchaseApi purchaseApi;
     @Autowired
     private InquiryApi inquiryApi;
     @Autowired
@@ -617,7 +617,7 @@ public class SaleServiceImpl implements SaleService{
        // Result<String> result = maxnumberService.getMaxnumber(BillCodeSeq.PURCHASE.getCaller(),false);
         baseDTO.setId(0l);
         baseDTO.setName(BillCodeSeq.PURCHASE.getCaller());
-        String result = purchaseService.getPurchaseCode(baseDTO);
+        String result = purchaseApi.getPurchaseCode(baseDTO);
         purchase.setPu_code(result);
         purchase.setPu_status(Status.UNAUDITED.getDisplay());
         purchase.setPu_statuscode(Status.UNAUDITED.toString());

+ 28 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/api/B2BPurchaseApi.java

@@ -0,0 +1,28 @@
+package com.usoftchina.saas.inquiry.api;
+
+import com.usoftchina.saas.inquiry.po.purchase.SavePurchaseListResp;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(url = "${b2b.baseUrl.uu}", name = "b2b-server")
+@RequestMapping("/erp/purchase")
+public interface B2BPurchaseApi {
+    /**
+     * 上传采购单
+     * @param data
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    SavePurchaseListResp savePurchase(@RequestParam("data") String data);
+
+    /**
+     * 结案、反结案采购单后,传到平台
+     * @param data
+     */
+    @PostMapping("/end")
+    void updatePurchaseDetailEnd(@RequestParam("data") String data);
+
+}

+ 302 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/Purchase.java

@@ -0,0 +1,302 @@
+package com.usoftchina.saas.inquiry.po.purchase;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description 采购单
+ * @Author chenwei
+ * @Date 2019/01/14
+ */
+public class Purchase implements Serializable {
+
+    private String pu_code;
+    private Date pu_date;
+    private Long em_uu;
+    private String em_name;
+    private String em_sex;
+    private String em_mobile;
+    private String em_email;
+    private Long ve_uu;
+    private String pu_cop;
+    private Long ve_contactuu;
+    private String ve_contact;
+    private String pu_currency;
+    private Float pu_rate;
+    private String pu_kind;  // 采购类型
+    private String pu_payments;
+    private String pu_remark;
+    private String pu_recordman;
+    private String pu_auditman;
+    private Date pu_indate;
+    private String pu_shipaddresscode;
+    private String pu_receivename;
+    private String pu_receivecode;
+    private Long pu_id;
+    private List<PurchaseDetail> purchaseDetails;
+    private String pu_purpose; // 用途,
+    private String pu_arcustcode; // 买家应收客户,
+    private String pu_shcustcode; // 收货客户,
+    private String pu_refcode; // 销售单号
+    private String pu_custcode; // 客户编号,
+    private String pu_custname; // 客户名称。
+    private String pu_transport;
+    private Long pu_b2bid;// 查询平台的id号
+
+    public String getPu_code() {
+        return pu_code;
+    }
+
+    public void setPu_code(String pu_code) {
+        this.pu_code = pu_code;
+    }
+
+    public Date getPu_date() {
+        return pu_date;
+    }
+
+    public void setPu_date(Date pu_date) {
+        this.pu_date = pu_date;
+    }
+
+    public Long getEm_uu() {
+        return em_uu;
+    }
+
+    public void setEm_uu(Long em_uu) {
+        this.em_uu = em_uu;
+    }
+
+    public String getEm_name() {
+        return em_name;
+    }
+
+    public void setEm_name(String em_name) {
+        this.em_name = em_name;
+    }
+
+    public String getEm_sex() {
+        return em_sex;
+    }
+
+    public void setEm_sex(String em_sex) {
+        this.em_sex = em_sex;
+    }
+
+    public String getEm_mobile() {
+        return em_mobile;
+    }
+
+    public void setEm_mobile(String em_mobile) {
+        this.em_mobile = em_mobile;
+    }
+
+    public String getEm_email() {
+        return em_email;
+    }
+
+    public void setEm_email(String em_email) {
+        this.em_email = em_email;
+    }
+
+    public Long getVe_uu() {
+        return ve_uu;
+    }
+
+    public void setVe_uu(Long ve_uu) {
+        this.ve_uu = ve_uu;
+    }
+
+    public String getPu_cop() {
+        return pu_cop;
+    }
+
+    public void setPu_cop(String pu_cop) {
+        this.pu_cop = pu_cop;
+    }
+
+    public Long getVe_contactuu() {
+        return ve_contactuu;
+    }
+
+    public void setVe_contactuu(Long ve_contactuu) {
+        this.ve_contactuu = ve_contactuu;
+    }
+
+    public String getVe_contact() {
+        return ve_contact;
+    }
+
+    public void setVe_contact(String ve_contact) {
+        this.ve_contact = ve_contact;
+    }
+
+    public String getPu_currency() {
+        return pu_currency;
+    }
+
+    public void setPu_currency(String pu_currency) {
+        this.pu_currency = pu_currency;
+    }
+
+    public Float getPu_rate() {
+        return pu_rate;
+    }
+
+    public void setPu_rate(Float pu_rate) {
+        this.pu_rate = pu_rate;
+    }
+
+    public String getPu_kind() {
+        return pu_kind;
+    }
+
+    public void setPu_kind(String pu_kind) {
+        this.pu_kind = pu_kind;
+    }
+
+    public String getPu_payments() {
+        return pu_payments;
+    }
+
+    public void setPu_payments(String pu_payments) {
+        this.pu_payments = pu_payments;
+    }
+
+    public String getPu_remark() {
+        return pu_remark;
+    }
+
+    public void setPu_remark(String pu_remark) {
+        this.pu_remark = pu_remark;
+    }
+
+    public String getPu_recordman() {
+        return pu_recordman;
+    }
+
+    public void setPu_recordman(String pu_recordman) {
+        this.pu_recordman = pu_recordman;
+    }
+
+    public String getPu_auditman() {
+        return pu_auditman;
+    }
+
+    public void setPu_auditman(String pu_auditman) {
+        this.pu_auditman = pu_auditman;
+    }
+
+    public Date getPu_indate() {
+        return pu_indate;
+    }
+
+    public void setPu_indate(Date pu_indate) {
+        this.pu_indate = pu_indate;
+    }
+
+    public String getPu_shipaddresscode() {
+        return pu_shipaddresscode;
+    }
+
+    public void setPu_shipaddresscode(String pu_shipaddresscode) {
+        this.pu_shipaddresscode = pu_shipaddresscode;
+    }
+
+    public String getPu_receivename() {
+        return pu_receivename;
+    }
+
+    public void setPu_receivename(String pu_receivename) {
+        this.pu_receivename = pu_receivename;
+    }
+
+    public String getPu_receivecode() {
+        return pu_receivecode;
+    }
+
+    public void setPu_receivecode(String pu_receivecode) {
+        this.pu_receivecode = pu_receivecode;
+    }
+
+    public Long getPu_id() {
+        return pu_id;
+    }
+
+    public void setPu_id(Long pu_id) {
+        this.pu_id = pu_id;
+    }
+
+    public List<PurchaseDetail> getPurchaseDetails() {
+        return purchaseDetails;
+    }
+
+    public void setPurchaseDetails(List<PurchaseDetail> purchaseDetails) {
+        this.purchaseDetails = purchaseDetails;
+    }
+
+    public String getPu_purpose() {
+        return pu_purpose;
+    }
+
+    public void setPu_purpose(String pu_purpose) {
+        this.pu_purpose = pu_purpose;
+    }
+
+    public String getPu_arcustcode() {
+        return pu_arcustcode;
+    }
+
+    public void setPu_arcustcode(String pu_arcustcode) {
+        this.pu_arcustcode = pu_arcustcode;
+    }
+
+    public String getPu_shcustcode() {
+        return pu_shcustcode;
+    }
+
+    public void setPu_shcustcode(String pu_shcustcode) {
+        this.pu_shcustcode = pu_shcustcode;
+    }
+
+    public String getPu_refcode() {
+        return pu_refcode;
+    }
+
+    public void setPu_refcode(String pu_refcode) {
+        this.pu_refcode = pu_refcode;
+    }
+
+    public String getPu_custcode() {
+        return pu_custcode;
+    }
+
+    public void setPu_custcode(String pu_custcode) {
+        this.pu_custcode = pu_custcode;
+    }
+
+    public String getPu_custname() {
+        return pu_custname;
+    }
+
+    public void setPu_custname(String pu_custname) {
+        this.pu_custname = pu_custname;
+    }
+
+    public String getPu_transport() {
+        return pu_transport;
+    }
+
+    public void setPu_transport(String pu_transport) {
+        this.pu_transport = pu_transport;
+    }
+
+    public Long getPu_b2bid() {
+        return pu_b2bid;
+    }
+
+    public void setPu_b2bid(Long pu_b2bid) {
+        this.pu_b2bid = pu_b2bid;
+    }
+}

+ 313 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/PurchaseDetail.java

@@ -0,0 +1,313 @@
+package com.usoftchina.saas.inquiry.po.purchase;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description 采购单明细
+ * @Author chenwei
+ * @Date 2019/01/14
+ */
+public class PurchaseDetail implements Serializable {
+
+    private String pd_code;
+    private String pd_prodcode;
+    private Double pd_qty;
+    private Double pd_price;
+    private Date pd_delivery;
+    private String pd_remark;
+    private Float pd_rate;
+    private short pd_detno;
+    private String pd_factory;
+    private String pd_vendspec;
+    private Integer pd_beipin;
+    //终端供应商名称
+    private String pd_purcvendname;
+    //终端供应商uu
+    private Long pd_purcvenduu;
+    //客户采购订单号
+    private String pd_custpurchasecode;
+    //客户采购订单序号
+    private Short pd_custpurchasedetno;
+    //收货客户
+    private String pd_acceptcustname;
+    //收货地址
+    private String pd_acceptcustaddress;
+    //收货客户uu
+    private Long pd_acceptcustuu;
+    //是否能发货
+    private String pd_hasissued;
+    //终端价格
+    private Float pd_purcprice;
+    //终端税率
+    private Float pd_purctaxrate;
+    //终端币别
+    private String pd_purccurrency;
+    //税收分类编码
+    private String pd_taxcode;
+    //开票名称
+    private String pd_billname;
+    //开票型号
+    private String pd_orispeccode;
+    //替代料号
+    private String pd_repprodcode;
+    //替代料名称
+    private String pd_repdetail;
+    //替代料规格
+    private String pd_repspec;
+
+    //旧料编号
+    private String pr_oldcode;
+    //旧料名称
+    private String pr_oldname;
+    //旧料规格
+    private String pr_oldspec;
+
+    public String getPd_code() {
+        return pd_code;
+    }
+
+    public void setPd_code(String pd_code) {
+        this.pd_code = pd_code;
+    }
+
+    public String getPd_prodcode() {
+        return pd_prodcode;
+    }
+
+    public void setPd_prodcode(String pd_prodcode) {
+        this.pd_prodcode = pd_prodcode;
+    }
+
+    public Double getPd_qty() {
+        return pd_qty;
+    }
+
+    public void setPd_qty(Double pd_qty) {
+        this.pd_qty = pd_qty;
+    }
+
+    public Double getPd_price() {
+        return pd_price;
+    }
+
+    public void setPd_price(Double pd_price) {
+        this.pd_price = pd_price;
+    }
+
+    public Date getPd_delivery() {
+        return pd_delivery;
+    }
+
+    public void setPd_delivery(Date pd_delivery) {
+        this.pd_delivery = pd_delivery;
+    }
+
+    public String getPd_remark() {
+        return pd_remark;
+    }
+
+    public void setPd_remark(String pd_remark) {
+        this.pd_remark = pd_remark;
+    }
+
+    public Float getPd_rate() {
+        return pd_rate;
+    }
+
+    public void setPd_rate(Float pd_rate) {
+        this.pd_rate = pd_rate;
+    }
+
+    public short getPd_detno() {
+        return pd_detno;
+    }
+
+    public void setPd_detno(short pd_detno) {
+        this.pd_detno = pd_detno;
+    }
+
+    public String getPd_factory() {
+        return pd_factory;
+    }
+
+    public void setPd_factory(String pd_factory) {
+        this.pd_factory = pd_factory;
+    }
+
+    public String getPd_vendspec() {
+        return pd_vendspec;
+    }
+
+    public void setPd_vendspec(String pd_vendspec) {
+        this.pd_vendspec = pd_vendspec;
+    }
+
+    public Integer getPd_beipin() {
+        return pd_beipin;
+    }
+
+    public void setPd_beipin(Integer pd_beipin) {
+        this.pd_beipin = pd_beipin;
+    }
+
+    public String getPd_purcvendname() {
+        return pd_purcvendname;
+    }
+
+    public void setPd_purcvendname(String pd_purcvendname) {
+        this.pd_purcvendname = pd_purcvendname;
+    }
+
+    public Long getPd_purcvenduu() {
+        return pd_purcvenduu;
+    }
+
+    public void setPd_purcvenduu(Long pd_purcvenduu) {
+        this.pd_purcvenduu = pd_purcvenduu;
+    }
+
+    public String getPd_custpurchasecode() {
+        return pd_custpurchasecode;
+    }
+
+    public void setPd_custpurchasecode(String pd_custpurchasecode) {
+        this.pd_custpurchasecode = pd_custpurchasecode;
+    }
+
+    public Short getPd_custpurchasedetno() {
+        return pd_custpurchasedetno;
+    }
+
+    public void setPd_custpurchasedetno(Short pd_custpurchasedetno) {
+        this.pd_custpurchasedetno = pd_custpurchasedetno;
+    }
+
+    public String getPd_acceptcustname() {
+        return pd_acceptcustname;
+    }
+
+    public void setPd_acceptcustname(String pd_acceptcustname) {
+        this.pd_acceptcustname = pd_acceptcustname;
+    }
+
+    public String getPd_acceptcustaddress() {
+        return pd_acceptcustaddress;
+    }
+
+    public void setPd_acceptcustaddress(String pd_acceptcustaddress) {
+        this.pd_acceptcustaddress = pd_acceptcustaddress;
+    }
+
+    public Long getPd_acceptcustuu() {
+        return pd_acceptcustuu;
+    }
+
+    public void setPd_acceptcustuu(Long pd_acceptcustuu) {
+        this.pd_acceptcustuu = pd_acceptcustuu;
+    }
+
+    public String getPd_hasissued() {
+        return pd_hasissued;
+    }
+
+    public void setPd_hasissued(String pd_hasissued) {
+        this.pd_hasissued = pd_hasissued;
+    }
+
+    public Float getPd_purcprice() {
+        return pd_purcprice;
+    }
+
+    public void setPd_purcprice(Float pd_purcprice) {
+        this.pd_purcprice = pd_purcprice;
+    }
+
+    public Float getPd_purctaxrate() {
+        return pd_purctaxrate;
+    }
+
+    public void setPd_purctaxrate(Float pd_purctaxrate) {
+        this.pd_purctaxrate = pd_purctaxrate;
+    }
+
+    public String getPd_purccurrency() {
+        return pd_purccurrency;
+    }
+
+    public void setPd_purccurrency(String pd_purccurrency) {
+        this.pd_purccurrency = pd_purccurrency;
+    }
+
+    public String getPd_taxcode() {
+        return pd_taxcode;
+    }
+
+    public void setPd_taxcode(String pd_taxcode) {
+        this.pd_taxcode = pd_taxcode;
+    }
+
+    public String getPd_billname() {
+        return pd_billname;
+    }
+
+    public void setPd_billname(String pd_billname) {
+        this.pd_billname = pd_billname;
+    }
+
+    public String getPd_orispeccode() {
+        return pd_orispeccode;
+    }
+
+    public void setPd_orispeccode(String pd_orispeccode) {
+        this.pd_orispeccode = pd_orispeccode;
+    }
+
+    public String getPd_repprodcode() {
+        return pd_repprodcode;
+    }
+
+    public void setPd_repprodcode(String pd_repprodcode) {
+        this.pd_repprodcode = pd_repprodcode;
+    }
+
+    public String getPd_repdetail() {
+        return pd_repdetail;
+    }
+
+    public void setPd_repdetail(String pd_repdetail) {
+        this.pd_repdetail = pd_repdetail;
+    }
+
+    public String getPd_repspec() {
+        return pd_repspec;
+    }
+
+    public void setPd_repspec(String pd_repspec) {
+        this.pd_repspec = pd_repspec;
+    }
+
+    public String getPr_oldcode() {
+        return pr_oldcode;
+    }
+
+    public void setPr_oldcode(String pr_oldcode) {
+        this.pr_oldcode = pr_oldcode;
+    }
+
+    public String getPr_oldname() {
+        return pr_oldname;
+    }
+
+    public void setPr_oldname(String pr_oldname) {
+        this.pr_oldname = pr_oldname;
+    }
+
+    public String getPr_oldspec() {
+        return pr_oldspec;
+    }
+
+    public void setPr_oldspec(String pr_oldspec) {
+        this.pr_oldspec = pr_oldspec;
+    }
+}

+ 22 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/SavePurchaseListReq.java

@@ -0,0 +1,22 @@
+package com.usoftchina.saas.inquiry.po.purchase;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description 保存采购单上传对象
+ * @Author chenwei
+ * @Date 2019/01/14
+ */
+public class SavePurchaseListReq implements Serializable {
+
+    List<Purchase> data;
+
+    public List<Purchase> getData() {
+        return data;
+    }
+
+    public void setData(List<Purchase> data) {
+        this.data = data;
+    }
+}

+ 22 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/saas/inquiry/po/purchase/SavePurchaseListResp.java

@@ -0,0 +1,22 @@
+package com.usoftchina.saas.inquiry.po.purchase;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description 保存采购单响应对象
+ * @Author chenwei
+ * @Date 2019/01/14
+ */
+public class SavePurchaseListResp implements Serializable {
+
+    List<Purchase> data;
+
+    public List<Purchase> getData() {
+        return data;
+    }
+
+    public void setData(List<Purchase> data) {
+        this.data = data;
+    }
+}

+ 4 - 0
applications/transfers/transfers-server/pom.xml

@@ -68,6 +68,10 @@
           <groupId>com.usoftchina.saas</groupId>
           <artifactId>mall-api</artifactId>
         </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>purchase-api</artifactId>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>

+ 1 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/service/ReceiveService.java

@@ -56,7 +56,7 @@ public class ReceiveService {
         Executable task = null;
        try {
            switch(BillCodeSeq.valueOf(info.getBizType())) {
-               case PURCHASE:
+               case PURCHASE:       //采购单上传
                    task = new SendPurchaseTask();
                    break;
                case PURCHASEIN:

+ 1 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendProductTask.java

@@ -37,7 +37,7 @@ public class SendProductTask extends Executable{
 
     @Override
     public void execute(MessageInfo messageInfo) {
-        Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
+        Long enUU = companyApi.getCompanyById(messageInfo.getCompanyId()).getData().getUu();
         //需要上传的物料信息
         List<ProductUploadDTO> productUploadDTOList = productApi.getUploadData().getData();
         //上传结果反馈

+ 40 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseTask.java

@@ -1,14 +1,53 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.inquiry.api.B2BPurchaseApi;
+import com.usoftchina.saas.inquiry.po.purchase.Purchase;
+import com.usoftchina.saas.inquiry.po.purchase.PurchaseDetail;
+import com.usoftchina.saas.purchase.api.PurchaseApi;
+import com.usoftchina.saas.purchase.dto.PurchaseDTO;
+import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
 import com.usoftchina.saas.transfers.dto.MessageInfo;
+import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.ObjectUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
 
 /**
  * @author: guq
  * @create: 2019-01-08 13:45
  **/
 public class SendPurchaseTask extends Executable {
+
+    @Autowired
+    private CompanyApi companyApi;
+    @Autowired
+    private PurchaseApi purchaseApi;
+    @Autowired
+    private B2BPurchaseApi b2BPurchaseApi;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SendProductTask.class);
+
     @Override
     public void execute(MessageInfo messageInfo) {
-        //TODO
+        PurchaseFormDTO purchaseFormDTO = purchaseApi.getFormData(Long.parseLong(messageInfo.getBizId())).getData();
+        if (!ObjectUtils.isEmpty(purchaseFormDTO)){
+            //采购单主表数据
+            PurchaseDTO purchaseDTO = purchaseFormDTO.getMain();
+            Purchase b2bPurchase = BeanMapper.map(purchaseDTO, Purchase.class);
+            //b2bPurchase.setVe_uu(0L);
+            //采购单明细表数据
+            List<PurchaseDetail> b2bPurchaseDetailList = BeanMapper.mapList(purchaseFormDTO.getItems(), PurchaseDetail.class);
+            b2bPurchase.setPurchaseDetails(b2bPurchaseDetailList);
+
+            /*SavePurchaseListResp savePurchaseListResp = */
+            b2BPurchaseApi.savePurchase(JsonUtils.toJsonString(b2bPurchase));
+            purchaseApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");
+        }
+
     }
 }

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

@@ -26,6 +26,15 @@ public class CompanyRegDTO implements Serializable{
     private String signet;      //电子章
     private String type;        //所属行业
     private String dcName;      //数据中心
+    private String accessKey;   //accessKey 企业秘钥,用于B2B数据对接
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
 
     public String getDcName() {
         return dcName;

+ 3 - 2
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java

@@ -85,11 +85,12 @@ public interface CompanyMapper {
     int updateByPrimaryKeySelective(CompanyRegDTO companyRegDTO);
 
     /**
-     * 更新UU号
+     * 更新UU号,企业秘钥
      * @param companyId
      * @param uu
+     * @param accessKey
      */
-    void updateUUByPrimaryKey(@Param("companyId") Long companyId, @Param("uu") Long uu);
+    void updateB2BMsgByPrimaryKey(@Param("companyId") Long companyId, @Param("uu") Long uu, @Param("accessKey") String accessKey);
 
     /**
      * 按名称(模糊)查找企业,返回企业名称、管理员名称、管理员手机号

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

@@ -101,11 +101,11 @@ public interface CompanyService {
     void update(CompanyRegDTO companyRegDTO);
 
     /**
-     * 更新公司UU号
+     * 更新公司UU号,企业秘钥
      * @param companyId
      * @param uu
      */
-    void updateUUByPrimaryKey(Long companyId, Long uu);
+    void updateB2BMsgByPrimaryKey(Long companyId, Long uu, String accessKey);
 
     /**
      * 按名称(模糊)查找企业,返回企业名称、管理员名称、管理员手机号

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

@@ -18,6 +18,7 @@ import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.StringUtils;
 import com.usoftchina.sso.api.SsoUserApi;
 import com.usoftchina.sso.api.SsoUserSpaceApi;
+import com.usoftchina.sso.dto.SsoResult;
 import com.usoftchina.sso.dto.SsoUserSpace;
 import com.usoftchina.sso.dto.SsoUserSpaceList;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,7 +79,11 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         companyService.bindApp(company.getId(), "trade-app");
         //b. 同步企业信息到优软云 ——>  创建企业
         if ("0".equals(type)) {
-            String result = ssoUserSpaceApi.registerLogin(company.getName(), company.getBusinessCode(), Long.parseLong(accountRegDTO.getUu()));
+            SsoResult<SsoUserSpace> result = ssoUserSpaceApi.registerLogin(company.getName(), company.getBusinessCode(), Long.parseLong(accountRegDTO.getUu()));
+            if (result.isSuccess()){
+                SsoUserSpace ssoUserSpace = result.getContent();
+                companyService.updateB2BMsgByPrimaryKey(company.getId(), ssoUserSpace.getSpaceUU(), ssoUserSpace.getAccessSecret());
+            }
         }
         //c.插入 账户公司 映射
         accountCompanyMapper.insert(accountId, company.getId());
@@ -145,7 +150,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                 if (companyRspDTO.getName().equals(ssoUserSpaces.get(i).getSpaceName())){
                     //更新公司UU号
                     if (StringUtils.isEmpty(companyRspDTO.getUu())){
-                        companyService.updateUUByPrimaryKey(companyRspDTO.getId(), ssoUserSpaces.get(i).getSpaceUU());
+                        companyService.updateB2BMsgByPrimaryKey(companyRspDTO.getId(), ssoUserSpaces.get(i).getSpaceUU(), ssoUserSpaces.get(i).getAccessSecret());
                     }
                     ssoUserSpaces.remove(ssoUserSpaces.get(i));
                 }

+ 1 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java

@@ -312,7 +312,7 @@ public class AccountServiceImpl implements AccountService {
                 for (SsoUserSpace ssoUserspace : ssoUserSpaces) {
                     if (companyName.equals(ssoUserspace.getSpaceName())) {
                         company.setUu(ssoUserspace.getSpaceUU());
-                        companyService.updateUUByPrimaryKey(company.getId(), ssoUserspace.getSpaceUU());
+                        companyService.updateB2BMsgByPrimaryKey(company.getId(), ssoUserspace.getSpaceUU(), ssoUserspace.getAccessSecret());
                     }
                 }
             }

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

@@ -56,8 +56,8 @@ public class CompanyServiceImpl implements CompanyService{
     }
 
     @Override
-    public void updateUUByPrimaryKey(Long companyId, Long uu) {
-        companyMapper.updateUUByPrimaryKey(companyId, uu);
+    public void updateB2BMsgByPrimaryKey(Long companyId, Long uu, String accessKey) {
+        companyMapper.updateB2BMsgByPrimaryKey(companyId, uu, accessKey);
     }
 
     @Override

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

@@ -173,7 +173,7 @@
                 signet = #{signet,jdbcType=VARCHAR},
             </if>
             <if test="type != null">
-                type = #{type,jdbcType=VARCHAR}
+                type = #{type,jdbcType=VARCHAR},
             </if>
             <if test="dcName != null">
                 dc_name = #{dcName,jdbcType=VARCHAR}
@@ -181,7 +181,7 @@
         </set>
         where id = #{id}
     </update>
-    <update id="updateUUByPrimaryKey">
-        UPDATE ac_company set uu = #{uu} where id = #{companyId}
+    <update id="updateB2BMsgByPrimaryKey">
+        UPDATE ac_company set uu = #{uu}, access_key = #{accessKey} where id = #{companyId}
     </update>
 </mapper>

+ 3 - 2
base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserSpaceApi.java

@@ -1,6 +1,7 @@
 package com.usoftchina.sso.api;
 
 import com.usoftchina.sso.dto.SsoResult;
+import com.usoftchina.sso.dto.SsoUserSpace;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -30,7 +31,7 @@ public interface SsoUserSpaceApi {
      * @return
      */
     @PostMapping("/sso/userspace/register/admin")
-    String registerLogin(@RequestParam("spaceName") String spaceName, @RequestParam("businessCode") String businessCode, @RequestParam("userUU") Long userUU);
+    SsoResult<SsoUserSpace> registerLogin(@RequestParam("spaceName") String spaceName, @RequestParam("businessCode") String businessCode, @RequestParam("userUU") Long userUU);
 
     @Component
     class DefaultFallback implements SsoUserSpaceApi{
@@ -41,7 +42,7 @@ public interface SsoUserSpaceApi {
         }
 
         @Override
-        public String registerLogin(String spaceName, String businessCode, Long userUU) {
+        public SsoResult<SsoUserSpace> registerLogin(String spaceName, String businessCode, Long userUU) {
             return null;
         }
     }

+ 5 - 3
base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserSpaceApiTeest.java

@@ -1,8 +1,10 @@
 package com.usoftchina.sso.test;
 
+import com.usoftchina.saas.utils.JsonUtils;
 import com.usoftchina.saas.utils.StringUtils;
 import com.usoftchina.sso.api.SsoUserSpaceApi;
 import com.usoftchina.sso.dto.SsoResult;
+import com.usoftchina.sso.dto.SsoUserSpace;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,10 +33,10 @@ public class SsoUserSpaceApiTeest {
 
     @Test
     public void testB_registerLogin(){
-        String spaceName = "测试企业009";
+        String spaceName = "测试i企业注册11";
         String businessCode = StringUtils.createBusinessCode();
         Long userUU = 1000027276l;
-        String result = ssoUserSpaceApi.registerLogin(spaceName, businessCode, userUU);
-        System.out.println(result);
+        SsoResult<SsoUserSpace> result = ssoUserSpaceApi.registerLogin(spaceName, businessCode, userUU);
+        System.out.println(JsonUtils.toJsonString(result.getContent()));
     }
 }

+ 15 - 7
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -111,7 +111,7 @@
       <!-- End Home SliderEnd==================================== -->
 
       <!-- 特色 -->
-      <section id="feature">
+      <section id="feature" ref="feature">
         <div class="container ts-worp">
           <div class="section-title text-center" style="margin-bottom: 50px">
             <p class="ts-title">我们的特色</p>
@@ -373,6 +373,7 @@
       };
       // document.documentElement.scrollTop = this.isfeature;
       window.addEventListener("scroll",this.handleFun);
+        // this.scrollH = Math.floor($('#feature').offset().top) - 260;
     },
     computed: {
       setTokenPage() {
@@ -394,9 +395,11 @@
     },
     methods: {
       handleFun(){
-        let Y = $(window).scrollTop();
+        let top = $(window).scrollTop();
+        let Y = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
         if ($('#feature').offset()) {
-          var scrollH = Math.floor($('#feature').offset().top) - 260;//500
+          // var scrollH = Math.floor($('#feature').offset().top) - 260;//500
+          var scrollH = Math.floor(this.$refs.feature.offsetTop) - 260;//500
         }
         if (Y >= scrollH && Y <= scrollH + 1000) {
           $(".animate1").stop();
@@ -639,10 +642,15 @@
             var step = (target - leader) / 10;
             step = step > 0 ? Math.ceil(step) : Math.floor(step);
             leader = leader + step;
-            document.documentElement.scrollTop = leader;
-            window.pageYOffset = leader;
-            document.body.scrollTop = leader;
-            if (leader === target) {
+            document.documentElement.scrollTop++;
+            if(document.documentElement.scrollTop ){
+              document.documentElement.scrollTop = leader;
+          }else if(window.pageYOffset){
+              window.pageYOffset = leader;
+          }else if(document.body.scrolltop){
+              document.body.scrolltop = leader;
+          }
+            if (leader == target) {
                 clearInterval(this.timer);
             }
         }, 5);

+ 1 - 1
frontend/saas-portal-web/src/components/conenter/problem.vue

@@ -20,7 +20,7 @@
                       <span class="left bz-yuandian"></span>
                       <!-- <span class="left bz-txttitle">{{d.title}}</span> -->
                       <span class="left bz-txttitle" v-html="keyword(d.title,searchVal)"></span>
-                      <img  class="right bz-copy" :class="d.isshow ? 'rotates' : 'norotate'" src="/static/img/Triangle Copy 4.png" alt="">
+                      <img  class="right bz-copy" :class="d.isshow ? 'rotates' : 'norotate'" src="/static/img/TriangleCopy.png" alt="">
                     </div>
                     <div ref="title" class="Text-content" :class="d.isshow ? 'dispays' : 'hides'">
                       <p ref="text">{{d.centent}}</p>

+ 5 - 2
frontend/saas-portal-web/src/components/footer/footer.vue

@@ -12,7 +12,7 @@
 					<div class="link">
 						<ul>
 							<li><span>产品</span></li>
-							<li><a href="#">U企云服</a></li>
+							<li><a href="#" @click="gohome">U企云服</a></li>
 							<li><a href="https://mall.usoftchina.com/" target="_blank">U软商城</a></li>
 							<li><a href="https://fin.yitoa-fintech.com/" target="_blank">U智融</a></li>
 							<li><a href="https://zb.usoftchina.com/" target="_blank">闯客网</a></li>
@@ -67,7 +67,10 @@
 				this.$router.push({name: 'Home', params: {isporblem: false}})
 				this.$store.commit("problemfalse")
 				document.documentElement.scrollTop = 0;
-			}
+			},
+			gohome(){
+				this.$store.commit("problemtrue")
+			},
 		}
     }
 </script>

+ 6 - 5
frontend/saas-web/app/view/core/base/BasePanel.js

@@ -23,6 +23,7 @@ Ext.define('saas.view.core.base.BasePanel', {
     },
     
     searchField:[],
+    toolButtons: [],
     gridColumns: [],
 
     deleteMoreMsg: '确认删除所选单据?',
@@ -49,18 +50,18 @@ Ext.define('saas.view.core.base.BasePanel', {
                 frame:false,
                 xtype: 'toolbar',
                 dock: 'top',
-                layout: 'column',
+                // layout: 'column',
                 style: {
                     margin: '0 0 12px 0',
                     padding: '10px 0 14px 8px',
                 },
-                items: me.searchField.concat([{
+                items: Ext.Array.merge(me.searchField, [{
                     xtype: 'button',
                     text: '查询',
                     handler: function() {
                         me.onQuery()
                     }
-                }])
+                }], ['->'], me.toolButtons)
             }],
             items: [gridcfg]
         });
@@ -113,7 +114,7 @@ Ext.define('saas.view.core.base.BasePanel', {
             value = item.value,
             condition;
 
-            if(value&&value!=''){
+            if(value !== undefined && value !== null && value !== ''){
                 if(typeof func == 'function') {
                     condition = {
                         type: 'condition',
@@ -124,7 +125,7 @@ Ext.define('saas.view.core.base.BasePanel', {
                     operation = item.operation || me.getDefaultFieldOperation(item),
                     conditionValue = me.getConditionValue(item, value);
         
-                    if(!conditionValue) {
+                    if(conditionValue === undefined && conditionValue === null && conditionValue === '') {
                         continue;
                     }
                     condition = {

+ 36 - 31
frontend/saas-web/app/view/core/base/GridPanel.js

@@ -208,37 +208,9 @@ Ext.define('saas.view.core.base.GridPanel', {
             store.setPageSize(pageSize);
         },
         itemClick: function(view,record,a,index,c) {
-            var classList = c.target.classList.value;
-            var form = view.ownerCt.ownerCt;
-            if(classList.indexOf('fa-pencil')>-1){
-                var config = {};
-                config.initId = record.get('id');
-                saas.util.BaseUtil.openTab(form._formXtype, '修改'+form._title, form._formXtype+config.initId, config);
-            }else if(classList.indexOf('fa-trash-o')>-1){
-                //删除
-                var id = record.get('id');
-                if(id){
-                    saas.util.BaseUtil.showConfirm('警告', form.deleteOneMsg)
-                    .then(function(yes) {
-                        if(yes == 'yes') {
-                            saas.util.BaseUtil.request({
-                                url: form._deleteUrl+'/'+id,
-                                method: 'POST',
-                            })
-                            .then(function(localJson) {
-                                if(localJson.success){
-                                    //解析参数
-                                    saas.util.BaseUtil.showSuccessToast('删除成功');
-                                    view.ownerCt.store.load();
-                                }
-                            })
-                            .catch(function(e) {
-                                saas.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
-                            });
-                        }
-                    });
-                }
-            }
+            var form = view.up('core-base-basepanel');
+            var grid = view.up('core-base-gridpanel');
+            grid.onItemClick(form, grid,record,a,index,c);
         }
     },
 
@@ -263,6 +235,39 @@ Ext.define('saas.view.core.base.GridPanel', {
         });
     },
 
+    onItemClick: function(form, grid, record,a,index,c) {
+        var classList = c.target.classList.value;
+        if(classList.indexOf('fa-pencil')>-1){
+            var config = {};
+            config.initId = record.get('id');
+            saas.util.BaseUtil.openTab(form._formXtype, '修改'+form._title, form._formXtype+config.initId, config);
+        }else if(classList.indexOf('fa-trash-o')>-1){
+            //删除
+            var id = record.get('id');
+            if(id){
+                saas.util.BaseUtil.showConfirm('警告', form.deleteOneMsg)
+                .then(function(yes) {
+                    if(yes == 'yes') {
+                        saas.util.BaseUtil.request({
+                            url: form._deleteUrl+'/'+id,
+                            method: 'POST',
+                        })
+                        .then(function(localJson) {
+                            if(localJson.success){
+                                //解析参数
+                                saas.util.BaseUtil.showSuccessToast('删除成功');
+                                grid.store.load();
+                            }
+                        })
+                        .catch(function(e) {
+                            saas.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+                        });
+                    }
+                });
+            }
+        }
+    },
+
     onLoad:function(){
         this.ownerCt.ownerCt.store.load();
     },

+ 1 - 1
frontend/saas-web/app/view/money/othreceipts/FormPanel.js

@@ -78,7 +78,7 @@ Ext.define('saas.view.money.othreceipts.FormPanel', {
                 // },
                 mainFieldConfig: {
                     readOnly: true,
-                    defaultReadOnly: false,
+                    defaultReadOnly: true,
                 },
                 supFieldConfig: {
                     xtype: 'numberfield',

+ 6 - 0
frontend/saas-web/app/view/money/othreceipts/FormPanelController.js

@@ -83,6 +83,12 @@ Ext.define('saas.view.money.othreceipts.FormPanelController', {
                         }, {
                             from: 'cu_name',
                             to: 'or_custname'
+                        }, {
+                            from: 'cu_currency',
+                            to: 'or_currency'
+                        }, {
+                            from: 'cr_rate',
+                            to: 'or_rate'
                         }],
                     });
 

+ 1 - 1
frontend/saas-web/app/view/money/othspendings/FormPanel.js

@@ -72,7 +72,7 @@ Ext.define('saas.view.money.othspendings.FormPanel', {
                 // },
                 mainFieldConfig: {
                     readOnly: true,
-                    defaultReadOnly: false,
+                    defaultReadOnly: true,
                 },
                 supFieldConfig: {
                     xtype: 'numberfield',

+ 6 - 0
frontend/saas-web/app/view/money/othspendings/FormPanelController.js

@@ -74,6 +74,12 @@ Ext.define('saas.view.money.othspendings.FormPanelController', {
                         }, {
                             from: 've_name',
                             to: 'os_vendname'
+                        }, {
+                            from: 've_currency',
+                            to: 'os_currency'
+                        }, {
+                            from: 'cr_rate',
+                            to: 'os_rate'
                         }],
                     });
 

+ 64 - 6
frontend/saas-web/app/view/sale/business/Business.js

@@ -33,14 +33,14 @@ Ext.define('saas.view.sale.business.Business', {
                 queryMode: 'local',
                 displayField: 'name',
                 valueField: 'value',
-                emptyText :'全部',
+                emptyText :'未报价',
+                value: '0',
                 editable:false,
                 labelWidth: 80,
                 columnWidth: 0.2,
                 store: Ext.create('Ext.data.ArrayStore', {
                     fields: ['name', 'value'],
                     data: [
-                        ["全部", "all"],
                         ["未报价", "0"],
                         ["已报价", "1"]
                     ]
@@ -131,8 +131,60 @@ Ext.define('saas.view.sale.business.Business', {
                 }, {
                     text: '操作',
                     dataIndex: 'quoted',
-                    renderer: function(v, m) {
-                        return v == 1 ? '<a style="color: green; cursor: pointer;">报价中</a>' : '<a style="color: #35BAF6; cursor: pointer;">报价</a>';
+                    renderer:function(val, meta, record,x,y,store, view){
+                        if(val == 0){
+                            return '<a style="color: #35BAF6; cursor: pointer;">点击报价</a>';
+                        }
+                        var id = record.id;
+                        var grid = view.up('grid');
+                        
+                        if(!view.tip) {
+                            view.tip = Ext.create('Ext.tip.ToolTip', {
+                                hidden: true,
+                                target: view.el,
+                                delegate: '.x-grid-cell-'+meta.column.id,
+                                trackMouse: true,
+                                renderTo: Ext.getBody(),	
+                                maxWidth :830,
+                                layout:'anchor',
+                                listeners: {								          
+                                    beforeshow: function updateTipBody(tip) {
+                                        var dg = Ext.getCmp('grid-'+id);
+                                        var record = grid.focusRecord;
+                                        if(record.data.qutations.agreed) {
+                                            this.setHtml(null);
+                                            var replies = record.data.qutations.replies;
+                                            dg.store.loadData(replies);
+                                            dg.show();
+                                        }else {
+                                            dg.hide();
+                                            this.setHtml(record.data.qutations.refusereason || '无');
+                                        }
+                                    }
+                                },
+                                items : [Ext.create('Ext.grid.Panel', {
+                                    id: 'grid-'+id,
+                                    frame:true,
+                                    anchor: '100% 100%',
+                                    width:205,
+                                    store:[],
+                                    columns: [{
+                                        text: '分段数量',
+                                        dataIndex: 'lapQty',
+                                        width: 110
+                                    }, {
+                                        text: '分段价格',
+                                        dataIndex: 'price',
+                                        width: 90
+                                    }]
+                                })]
+                            });
+                        }
+                        if(record.data.qutations.agreed) {
+                            return '<div style="text-align: center;color: green;">查看报价信息</div>';
+                        }else {
+                            return '<div style="text-align: center;color:#ff6c00;">查看拒绝理由</div>';
+                        }
                     },
                     listeners: {
                         click: function(tableView, td, rowIdx, colIdx, e, model, tr) {
@@ -143,9 +195,15 @@ Ext.define('saas.view.sale.business.Business', {
                             if(value == '0') {
                                 me.getController().showQuoteWin(record);
                             }
-                        }
+                        },
+                    }
+                }],
+                listeners: {
+                    itemmouseenter: function(view, record, item, index, e, eOpts) {
+                        var grid = view.up('grid');
+                        grid.focusRecord = record;
                     }
-                }]
+                }
             },
         });
         this.callParent(arguments);

+ 97 - 79
frontend/saas-web/app/view/sale/business/Product.js

@@ -5,50 +5,73 @@ Ext.define('saas.view.sale.business.Product', {
     extend: 'saas.view.core.base.BasePanel',
     xtype: 'sale-business-product',
 
-    controller: 'sale-business-Product',
-    viewModel: 'sale-business-Product',
     viewName: 'sale-business-Product',
 
 
-    // dataUrl: 'http://10.1.80.23:8560/api/sale/sale/enterprise/businessChance',
-    dataUrl: '/api/sale/sale/enterprise/businessChance',
+    // dataUrl: 'http://10.1.80.23:8560/api/document/product/prodStorage/list',
+    dataUrl: '/api/document/product/prodStorage/list',
     initComponent: function() {
         var me = this;
         Ext.apply(this, {
             searchField: [{
                 xtype: 'textfield',
                 name: 'keyword',
-                columnWidth: 0.15,
-                emptyText:'请输入物料编号/名称/型号/品牌'
+                columnWidth: 0.2,
+                emptyText:'请输入物料编号/名称/型号/品牌',
+                getCondition: function(value) {
+                    return  ' (prodCode like\'%' + value + '%\' or prodBrand like \'%'+value+'%\' or prodName like \'%'+value+'%\' or prodSpeccode like \'%'+value+'%\') ';
+                }
             }, {
                 xtype: 'combobox',
-                name: 'uploaded',
+                name: 'b2bStatus',
                 fieldLabel: '上传状态',
                 queryMode: 'local',
                 displayField: 'name',
                 valueField: 'value',
                 emptyText :'全部',
-                editable:false,
+                value: 0,
+                editable:true,
                 labelWidth: 80,
                 columnWidth: 0.2,
                 store: Ext.create('Ext.data.ArrayStore', {
                     fields: ['name', 'value'],
                     data: [
                         ["全部", "all"],
-                        ["未上传", "0"],
-                        ["已上传", "1"]
+                        ["待上传", "待上传"],
+                        ["已上传", "已上传"]
                     ]
-                })
+                }),
+                getCondition: function(v) {
+                    if(v == 'all') {
+                        return '1=1'
+                    }else {
+                        return 'ifnull(b2bStatus,\'待上传\')=' + '\'' + v + '\'';
+                    }
+                }
             }, {
                 xtype: 'checkbox',
-                name: 'self',
-                fieldLabel: '我的产品库'
+                name: 'status',
+                fieldLabel: '我的产品库',
+                columnWidth: 0.2,
+                getCondition: function(v) {
+                    if(v) {
+                        return 'status=' + Number(v);
+                    }else {
+                        return '1=1';
+                    }
+                }
+            }],
+
+            toolButtons: [{
+                xtype: 'button',
+                text: '上传公司产品',
+                handler: function() {
+                    me.onUpload();
+                }
             }],
         
             gridConfig: {
                 dataUrl: me.dataUrl,
-                rootProperty: 'data.content',
-                totalProperty: 'data.totalElements',
                 actionColumn: [],
                 selModel: {
                     type: 'cellmodel'
@@ -59,7 +82,7 @@ Ext.define('saas.view.sale.business.Product', {
                 }],
                 columns : [{
                     text: '物料编号',
-                    dataIndex: 'custName',
+                    dataIndex: 'prodCode',
                     width: 120
                 }, {
                     text: '品牌',
@@ -82,77 +105,72 @@ Ext.define('saas.view.sale.business.Product', {
                     dataIndex: 'prodUnit'
                 }, {
                     text: '上传状态',
-                    dataIndex: 'needQty'
+                    dataIndex: 'b2bStatus',
+                    renderer: function(v, m, r) {
+                        return v || '待上传';
+                    }
                 }, {
                     text: '我的产品',
-                    dataIndex: 'startDate'
+                    dataIndex: 'status',
+                    xtype: 'actioncolumn',
+                    align : 'center',
+                    items: [{
+                        iconCls:'',
+                        getClass: function(v, meta, rec) {
+                            if(rec.get('status')){
+                                return 'x-grid-checkcolumn-checked-btn';
+                            }else{
+                                return 'x-grid-checkcolumn-btn';
+                            }
+                        },
+                        handler: function(view, rowIndex, colIndex) {
+                            var rec = view.getStore().getAt(rowIndex);
+                            //  禁用/启用
+                            var grid = this.ownerCt.ownerCt;
+                            var params = {
+                                prodId: rec.get('prodId'),
+                                prodCode: rec.get('prodCode'),
+                                operate: new Number(!rec.get('status'))
+                            };
+                            grid.setLoading(true);
+                            saas.util.BaseUtil.request({
+                                url: 'http://10.1.80.23:8560/api/document/product/prodStorage/saler',
+                                params: JSON.stringify(params),
+                                method: 'POST',
+                            })
+                            .then(function(localJson) {
+                                grid.setLoading(false);
+                                if(localJson.success){
+                                    saas.util.BaseUtil.showSuccessToast('操作成功');
+                                    grid.store.load();
+                                }
+                            })
+                            .catch(function(e) {
+                                grid.setLoading(false);
+                                saas.util.BaseUtil.showErrorToast('操作失败: ' + e.message);
+                            });
+                        }
+                    }]
                 }]
             },
         });
         this.callParent(arguments);
     },
 
-    /**
-     * 处理部分字段值
-     */
-    getConditionValue: function (field, value) {
-        var me = this,
-            xtypes = field.getXTypes().split('/'),
-            conditionValue;
-        if (me.isContainsAny(xtypes, ['datefield'])) {
-            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
-        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
-            var from = value.from,
-                to = value.to;
-
-            conditionValue = from + ',' + to;
-        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
-            var from = value.from,
-                to = value.to;
-
-            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
-        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
-            conditionValue = value;
-        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
-            conditionValue = value;
-        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
-            conditionValue = value.map ? value.map(function (v) {
-                return v.value;
-            }).join(',') : '';
-        } else {
-            conditionValue = value;
-        }
-
-        return conditionValue;
+    onUpload: function() {
+        var me = this;
+        me.setLoading(true);
+        saas.util.BaseUtil.request({
+            url: '/api/document/product/b2b/upload',
+            method: 'POST',
+        }).then(function(res) {
+            me.setLoading(false);
+            saas.util.BaseUtil.showSuccessToast('上传成功');
+            me.refresh();
+        }).catch(function(e) {
+            me.setLoading(false);
+            saas.util.BaseUtil.showErrorToast('上传失败: ' + e.message);
+        });
     },
 
-    getExtraParams: function(store, op, condition) {
-        var temp = {};
-
-        for(let x = 0; x < condition.length; x++) {
-            let c = condition[x];
-            if(c.field == 'keyword') {
-                temp.keyword = c.value;
-            }else if(c.field == 'date') {
-                temp.fromDate = new Date(c.value.split(',')[0]).getTime();
-                temp.endDate = new Date(c.value.split(',')[1]).getTime();
-            }else if(c.field == 'quoted') {
-                temp.quoted = c.value == 'all' ? null : c.value;
-            }else if(c.field == 'closed') {
-                // temp.endDate = c.value == 'all' ? null : (
-                //     c.value == '0' ? 
-                // );
-            }
-        }
-        let obj = {
-            pageNumber: store.exportNumber?store.exportNumber:op._page,
-            pageSize: store.exportPageSize?store.exportPageSize:store.pageSize
-        };
-        for(let k in temp) {
-            if(!!temp[k]) {
-                obj[k] = temp[k];
-            }
-        }
-        return obj;
-     },
 });

+ 92 - 431
frontend/saas-web/app/view/sys/maxnumbers/DataList.js

@@ -1,445 +1,106 @@
-/**
- * Created by zhouy on 2018/10/18.
- */
-Ext.define('saas.view.sys.maxnumbers.DataList', {
-    extend: 'Ext.grid.Panel',
+Ext.define('saas.view.sys.maxnumbers.DataList1', {
+    extend: 'saas.view.core.base.BasePanel',
     xtype: 'sys-maxnumbers-datalist',
+
     controller: 'sys-maxnumbers-datalist',
     viewModel: 'sys-maxnumbers-datalist',
-    autoScroll: true,
-    frame:true,
-    layout:'fit',
-    
-    dataUrl:'/api/commons/number/list',                 
-    deleteUrl:'/api/commons/number/delete/',
-
-    plugins: [{
-        ptype: 'menuclipboard'
-    }],
-
-    tbar: [{
-        width: 110,
-        name: 'mn_name',
-        xtype: 'textfield',
-        emptyText : '单据名称',
-        enableKeyEvents: true,
-        listeners: {
-            keydown: {
-                fn: function(th, e, eOpts) {
-                    if(e.keyCode == 13) {
-                        var grid = th.up('grid');
-                        grid.condition = grid.getConditions();
-                        grid.store.loadPage(1);
-                    }
-                }
-            }
-        }
-    },{
-        width: 110,
-        name: 'mn_leadcode',
-        xtype: 'textfield',
-        emptyText : '单据前缀',
-        enableKeyEvents: true,
-        listeners: {
-            keydown: {
-                fn: function(th, e, eOpts) {
-                    if(e.keyCode == 13) {
-                        var grid = th.up('grid');
-                        grid.condition = grid.getConditions();
-                        grid.store.loadPage(1);
-                    }
-                }
-            }
-        }
-    },{
-        cls:'x-formpanel-btn-blue',
-        xtype:'button',
-        text:'查询',
-        listeners: {
-            click:function(b){
-                var grid = b.ownerCt.ownerCt;
-                grid.condition = grid.getConditions();
-                grid.store.loadPage(1);
-            }
-        }
-    },'->',{
-        cls:'x-formpanel-btn-blue',
-        xtype:'button',
-        text:'新增',
-        hidden:true,
-        listeners: {
-            click: function(){
-                var form = this.ownerCt.ownerCt;
-                var grid = this.ownerCt.ownerCt.items.items[0].grid;
-                this.dialog = form.getController().getView().add({
-                    xtype: 'sys-maxnumbers-window',
-                    bind: {
-                        title: '新增单据编码规则'
-                    },
-                    _parent:form,
-                    _combo:grid,
-                    record:null,
-                    session: true
-                });
-                this.dialog.show();
-            }
-        }
-    }],
+    viewName: 'sys-maxnumbers-datalist',
 
-    columns : [{
-        text : 'id', 
-        width : 0, 
-        dataIndex : 'id', 
-        xtype : 'numbercolumn', 
-        hidden:true
-    },{
-        text : '单据名称', 
-        width : 200.0, 
-        dataIndex : 'mn_name', 
-        xtype : '', 
-    }, 
-    {
-        text : '单据前缀', 
-        dataIndex : 'mn_leadcode', 
-        width : 110.0, 
-        xtype : '', 
-    }, 
-    {
-        text : '单据规则', 
-        dataIndex : 'mn_rule', 
-        width : 150.0,
-        renderer: function(v) {
-            var o = {
-                yyyymmdd: '年月日',
-                yyyymm: '年月',
-                无: '无'
-            }
-            return o[v];
-        },
-    },{
-        text : '流水长度', 
-        dataIndex : 'mn_number',
-        xtype: 'numbercolumn',
-        width : 110.0,
-        renderer: function(v) {
-            return saas.util.BaseUtil.numberFormat(v, 0, false);
-        }
-    }, {
-        dataIndex: '',
-        flex: 1
-    }],
-
-    dbSearchFields: [],
-    condition:'',
 
+    dataUrl: '/api/commons/number/list',
+    // deleteUrl:'/api/commons/number/delete/',
     initComponent: function() {
         var me = this;
-        if(me.columns){
-            var fields = me.columns.map(column => column.dataIndex);
-            me.columns = me.insertFirstColumn(me.columns);
-            me.store = Ext.create('Ext.data.Store',{
-                fields:fields,
-                autoLoad: true,
-                pageSize: 11,
-                data: [],
-                proxy: {
-                    timeout:8000,
-                    type: 'ajax',
-                    url: me.dataUrl,
-                    actionMethods: {
-                        read: 'GET'
-                    },
-                    reader: {
-                        type: 'json',
-                        rootProperty: 'data.list',
-                        totalProperty: 'data.total',
+        Ext.apply(this, {
+            searchField: [{
+                xtype: 'textfield',
+                name: 'mn_name',
+                columnWidth: 0.2,
+                emptyText:'请输入单据名称'
+            }, {
+                name: 'mn_leadcode',
+                xtype: 'textfield',
+                emptyText : '单据前缀'
+            }],
+        
+            gridConfig: {
+                dataUrl: me.dataUrl,
+                deleteUrl:'/api/commons/number/delete/',
+                actionColumn: [{
+                    xtype:'actioncolumn',
+                    width:50,
+                    dataIndex:'actioncolumn',
+                    text:'操作',
+                    align: 'center',
+                    items: [{
+                        tooltip: '编辑',
+                        iconCls: 'x-fa fa-pencil fa-fw',
+                        scope:this
+                    }]
+                }],
+                onItemClick: function(form, grid, record,a,index,c) {
+                    var classList = c.target.classList.value;
+                    if(classList.indexOf('fa-pencil')>-1){
+                        var form = this.ownerCt;
+                        this.dialog = form.getController().getView().add({
+                            xtype: 'sys-maxnumbers-window',
+                            bind: {
+                                title: '修改单据编码规则'
+                            },
+                            _parent:form,
+                            _combo:this,
+                            record:record,
+                            session: true
+                        });
+                        this.dialog.show();
                     }
                 },
-                listeners: {
-                    beforeload: function (store, op) {
-                        var condition = me.condition;
-                        if (Ext.isEmpty(condition)) {
-                            condition = '';
+                selModel: {
+                    type: 'cellmodel'
+                },
+                hiddenTools: true,
+                data: [{
+
+                }],
+                columns : [{
+                    text : 'id', 
+                    width : 0, 
+                    dataIndex : 'id', 
+                    xtype : 'numbercolumn', 
+                    hidden:true
+                },{
+                    text : '单据名称', 
+                    width : 200.0, 
+                    dataIndex : 'mn_name', 
+                }, 
+                {
+                    text : '单据前缀', 
+                    dataIndex : 'mn_leadcode', 
+                    width : 110.0, 
+                }, 
+                {
+                    text : '单据规则', 
+                    dataIndex : 'mn_rule', 
+                    width : 150.0,
+                    renderer: function(v) {
+                        var o = {
+                            yyyymmdd: '年月日',
+                            yyyymm: '年月',
+                            无: '无'
                         }
-                        Ext.apply(store.proxy.extraParams, {
-                            number: op._page,
-                            size: store.pageSize,
-                            condition: JSON.stringify(condition)
-                        });
-                    }
-                }
-            });
-
-            Ext.apply(me, {
-                dockedItems:[{
-                    xtype: 'pagingtoolbar',
-                    dock: 'bottom',
-                    displayInfo: true,
-                    store: me.store
-                }]
-            });
-        }
-        me.callParent(arguments);
-    },
-
-    onVastDeal:function(url,type){
-        var form = this.ownerCt;
-        var grid = this;
-        var data = grid.getGridSelected(type);
-        if(!data){
-            saas.util.BaseUtil.showErrorToast('请勾选符合条件的行进行操作。');
-            return false;
-        }
-        if(data&&data.length>0){
-            var params = JSON.stringify({baseDTOs:data});
-            saas.util.BaseUtil.request({
-                    url: url,
-                    params: params,
-                    method: 'POST',
-                    async:false
-                })
-                .then(function() {
-                    saas.util.BaseUtil.showSuccessToast('操作成功');
-                    grid.store.load();
-                })
-                .catch(function(e) {
-                    saas.util.BaseUtil.showErrorToast('操作失败: ' + e.message);
-                });
-        }else{
-            saas.util.BaseUtil.showErrorToast('请勾选至少一条明细。');
-        }
-    },
-
-    listeners:{
-        boxready: function(grid, width, height, eOpts) {
-            var store = grid.getStore(),
-            gridBodyBox = grid.body.dom.getBoundingClientRect(),
-            gridBodyBoxHeight = gridBodyBox.height;
-
-            var pageSize = Math.floor(gridBodyBoxHeight / 32);
-
-            store.setPageSize(pageSize);
-
-            grid.ownerCt.el.dom.style.left = '8px';
-            grid.el.dom.style.padding = '0px'
-        },
-        itemClick: function(view,record,a,index,c) {
-            var classList = c.target.classList.value;
-            var grid = this;
-            if(classList.indexOf('fa-pencil')>-1){
-                var form = this.ownerCt;
-                this.dialog = form.getController().getView().add({
-                    xtype: 'sys-maxnumbers-window',
-                    bind: {
-                        title: '修改单据编码规则'
+                        return o[v];
                     },
-                    _parent:form,
-                    _combo:this,
-                    record:record,
-                    session: true
-                });
-                this.dialog.show();
-            }else if(classList.indexOf('fa-trash-o')>-1){
-                //删除
-                var id = record.get('id');
-                if(id){
-                    saas.util.BaseUtil.request({
-                        url: grid.deleteUrl+id,
-                        method: 'POST',
-                    })
-                    .then(function(localJson) {
-                        if(localJson.success){
-                            //解析参数
-                            saas.util.BaseUtil.showSuccessToast('删除成功');
-                            view.ownerCt.store.load();
-                        }
-                    })
-                    .catch(function(e) {
-                        saas.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
-                    });
-                }
-            }
-        }
-    },
-
-    insertFirstColumn:function(columns){
-        var me=this;
-        if(columns.length>0 && columns[0].xtype!='actioncolumn'){
-            return Ext.Array.insert(columns,0,[{
-                xtype:'actioncolumn',
-                width:50,
-                dataIndex:'actioncolumn',
-                text:'操作',
-                align: 'center',
-                items: [{
-                    tooltip: '编辑',
-                    iconCls: 'x-fa fa-pencil fa-fw',
-                    scope:this
+                },{
+                    text : '流水长度', 
+                    dataIndex : 'mn_number',
+                    xtype: 'numbercolumn',
+                    width : 110.0,
+                    renderer: function(v) {
+                        return saas.util.BaseUtil.numberFormat(v, 0, false);
+                    }
                 }]
-            }]);
-        }
-        return columns;
-    },
-
-    getGridSelected:function(type){
-        var isErrorSelect = false;
-        var checkField = this.statusCodeField;
-        var me = this,
-        items = me.selModel.getSelection(),
-        data = new Array() ;
-        Ext.each(items, function(item, index){
-            if(!Ext.isEmpty(item.data[me.idField])){
-                var o = new Object();
-                if(me.idField){
-                    o['id'] = item.data[me.idField];
-                }
-                if(me.codeField){
-                    o['code'] = item.data[me.codeField];
-                }
-                if(type&&type==item.data[checkField]){
-                    isErrorSelect = true
-                }
-                data.push(o);
-            }
+            },
         });
-        if(isErrorSelect){
-            return false;
-        }
-		return data;
-    },
-
-    /**
-     * 获得过滤条件
-     */
-    getConditions: function() {
-        var me = this,
-        tbar = me.getDockedItems()[0],
-        items = Ext.Array.filter(tbar.items.items, function(item) {
-            return !!item.name;
-        }),
-        conditions = [];
-        for(var i = 0; i < items.length; i++) {
-            var item = items[i];
-            var field = item.name,
-            func = item.getCondition,
-            value = item.value,
-            condition;
-
-            if(value&&value!=''){
-                if(typeof func == 'function') {
-                    condition = {
-                        type: 'condition',
-                        value: func(value)
-                    }
-                }else {
-                    var type = item.fieldType || me.getDefaultFieldType(item),
-                    operation = item.operation || me.getDefaultFieldOperation(item),
-                    conditionValue = me.getConditionValue(item, value);
-        
-                    if(!conditionValue) {
-                        continue;
-                    }
-                    condition = {
-                        type: type,
-                        field: field,
-                        operation: operation,
-                        value: conditionValue
-                    }
-                }
-                conditions.push(condition);
-            }
-        }
-
-        return conditions;
-    },
-
-    /**
-     * 只要arr1和arr2中存在相同项即返回真
-     */
-    isContainsAny: function (arr1, arr2) {
-        for (var i = 0; i < arr2.length; i++) {
-            var a2 = arr2[i];
-            if (!!arr1.find(function (a1) {
-                    return a1 == a2
-                })) {
-                return true;
-            }
-        }
-        return false;
-    },
-
-    getDefaultFieldType: function (field) {
-        var me = this,
-            xtypes = field.getXTypes().split('/'),
-            type;
-
-        if (me.isContainsAny(xtypes, ['numberfield'])) {
-            type = 'number';
-        } else if (me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
-            type = 'date';
-        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
-            type = 'enum';
-        } else if (me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
-            type = 'enum';
-        } else {
-            type = 'string';
-        }
-
-        return type;
-    },
-
-    getDefaultFieldOperation: function (field) {
-        var me = this,
-            xtypes = field.getXTypes().split('/'),
-            operation;
-
-        if (me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
-            operation = '=';
-        } else if (me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
-            operation = 'between';
-        } else if (me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
-            operation = 'in';
-        } else {
-            operation = 'like';
-        }
-
-        return operation;
-    },
-
-    /**
-     * 处理部分字段值
-     */
-    getConditionValue: function (field, value) {
-        var me = this,
-            xtypes = field.getXTypes().split('/'),
-            conditionValue;
-        if (me.isContainsAny(xtypes, ['datefield'])) {
-            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
-        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
-            var from = value.from,
-                to = value.to;
-
-            conditionValue = from + ',' + to;
-        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
-            var from = value.from,
-                to = value.to;
-
-            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
-        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
-            conditionValue = value;
-        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
-            conditionValue = '\'' + value + '\'';
-        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
-            conditionValue = value.map ? value.map(function (v) {
-                return '\'' + v.value + '\'';
-            }).join(',') : '';
-        } else {
-            conditionValue = value;
-        }
-
-        return conditionValue;
+        this.callParent(arguments);
     }
-
-})
-
-
+});

+ 0 - 5
frontend/saas-web/app/view/sys/maxnumbers/DataListController.js

@@ -2,9 +2,4 @@ Ext.define('saas.view.sys.maxnumbers.DataListController', {
     extend: 'saas.view.core.base.BasePanelController',
     alias: 'controller.sys-maxnumbers-datalist',
 
-    init: function (form) {
-        var me = this;
-        this.control({
-        });
-    }
 });

+ 5 - 0
frontend/saas-web/resources/json/navigation.json

@@ -70,6 +70,11 @@
             "text": "销售退货单",
             "addType": "sale-salein-formpanel",
             "viewType": "sale-salein-querypanel"
+        }, {
+            "b2b":true,
+            "id": "sale-business-product",
+            "text": "产品库",
+            "viewType": "sale-business-product"
         }, {
             "b2b":true,
             "id": "sale-business-business",