Эх сурвалжийг харах

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

hy 7 жил өмнө
parent
commit
47d23d157b

+ 1 - 1
applications/document/document-server/src/main/resources/application.yml

@@ -9,7 +9,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

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

@@ -49,10 +49,10 @@
         <!--productonhand-->
         <result column="pr_kind" property="pr_kind" jdbcType="VARCHAR" />
         <result column="pr_orispeccode" property="pr_orispeccode" jdbcType="VARCHAR" />
-        <result column=" pr_brand" property="pr_brand" jdbcType="VARCHAR" />
-        <result column=" pr_vendname" property="pr_vendname" jdbcType="VARCHAR" />
-        <result column=" pr_zxbzs" property="pr_zxbzs" jdbcType="VARCHAR" />
-        <result column=" pr_leadtime" property="pr_leadtime" jdbcType="INTEGER" />
+        <result column="pr_brand" property="pr_brand" jdbcType="VARCHAR" />
+        <result column="pr_vendname" property="pr_vendname" jdbcType="VARCHAR" />
+        <result column="pr_zxbzs" property="pr_zxbzs" jdbcType="VARCHAR" />
+        <result column="pr_leadtime" property="pr_leadtime" jdbcType="INTEGER" />
         <result column="pr_status" property="pr_status" jdbcType="VARCHAR" />
         <result column="pr_statuscode" property="pr_statuscode" jdbcType="VARCHAR" />
     </resultMap>

+ 11 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/MakeMaterial.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.storage.po;
 
 import com.usoftchina.saas.base.entity.CommonBaseEntity;
+import com.usoftchina.saas.document.entities.Product;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -35,6 +36,16 @@ public class MakeMaterial extends CommonBaseEntity implements Serializable {
 
     private String mm_remark;
 
+    private Product product;
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
     public Long getMm_maid() {
         return mm_maid;
     }

+ 2 - 3
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/config/WebConfig.java

@@ -8,7 +8,7 @@ import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
@@ -21,7 +21,7 @@ import java.util.List;
  **/
 
 @Configuration
-public class WebConfig extends WebMvcConfigurationSupport{
+public class WebConfig implements WebMvcConfigurer {
     @Bean
     public HttpMessageConverter<String> responseBodyConverter() {
         StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
@@ -40,7 +40,6 @@ public class WebConfig extends WebMvcConfigurationSupport{
 
     @Override
     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
-        super.configureMessageConverters(converters);
         converters.add(responseBodyConverter());
         converters.add(MappingJacksonHttpMessageConverter());
     }

+ 1 - 0
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/mapper/MakeMapper.java

@@ -25,4 +25,5 @@ public interface MakeMapper extends CommonBaseMapper<Make> {
 
     int validateCodeWhenUpdate(@Param("code") String code, @Param("id") Long id, @Param("companyId") Long company);
 
+    double getOnHand(@Param("prodcode") String prodcode, @Param("whcode") String whcode, @Param("companyId") Long companyId);
 }

+ 10 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java

@@ -140,12 +140,21 @@ public class MakeServiceImpl extends CommonBaseServiceImpl<MakeMapper, Make> imp
         List<MakeMaterial> makeMaterialList = makeListDTO.getItems();
         if ("组装".equals(make.getMa_type())){
             //判断明细的库存是否足够
+            int i = 0;
             for(MakeMaterial makeMaterial : makeMaterialList){
+                i++;
                 double qty = makeMaterial.getMm_qty() * makeMaterial.getMm_oneuseqty();
+                double onHand = getMapper().getOnHand(makeMaterial.getMm_prodcode(),makeMaterial.getMm_whcode(), BaseContextHolder.getCompanyId());
+                if(onHand < qty){
+                    throw new BizException(79402, "行" + i + "库存不足");
+                }
             }
         }else if ("拆件".equals(make.getMa_type())){
             double qty = make.getMa_qty();
-
+            double onHand = getMapper().getOnHand(make.getMa_prodcode(),make.getMa_whcode(),BaseContextHolder.getCompanyId());
+            if(onHand < qty){
+                throw new BizException(79402, make.getMa_prodcode() + ":库存不足");
+            }
         }
     }
 

+ 4 - 0
applications/storage/storage-server/src/main/resources/mapper/MakeMapper.xml

@@ -367,4 +367,8 @@
   <select id="validateCodeWhenUpdate" resultType="int" >
     select count(*) from MAKE where MA_CODE = #{code} and MA_ID != #{id} and companyId =#{companyId}
   </select>
+
+    <select id="getOnHand" resultType="double">
+        SELECT PW_ONHAND FROM PRODUCTWH WHERE PW_PRODCODE=#{prodcode} AND PW_WHCODE=#{whcode} and COMPANYID=#{companyId}
+    </select>
 </mapper>

+ 35 - 1
applications/storage/storage-server/src/main/resources/mapper/MakematerialMapper.xml

@@ -18,6 +18,40 @@
     <result column="companyId" property="companyId" jdbcType="INTEGER" />
     <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
     <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
+    <association property="product" jdbcType="com.usoftchina.saas.document.entities.Product">
+        <id column="pr_id" property="id" jdbcType="INTEGER" />
+        <result column="pr_code" property="pr_code" jdbcType="VARCHAR" />
+        <result column="pr_detail" property="pr_detail" jdbcType="VARCHAR" />
+        <result column="pr_spec" property="pr_spec" jdbcType="VARCHAR" />
+        <result column="pr_unit" property="pr_unit" jdbcType="VARCHAR" />
+        <result column="pr_kind" property="pr_kind" jdbcType="VARCHAR" />
+        <result column="pr_orispeccode" property="pr_orispeccode" jdbcType="VARCHAR" />
+        <result column="pr_whid" property="pr_whid" jdbcType="INTEGER" />
+        <result column="pr_whcode" property="pr_whcode" jdbcType="VARCHAR" />
+        <result column="pr_whname" property="pr_whname" jdbcType="VARCHAR" />
+        <result column="pr_zxbzs" property="pr_zxbzs" jdbcType="INTEGER" />
+        <result column="pr_leadtime" property="pr_leadtime" jdbcType="INTEGER" />
+        <result column="pr_brand" property="pr_brand" jdbcType="VARCHAR" />
+        <result column="pr_standardprice" property="pr_standardprice" jdbcType="DOUBLE" />
+        <result column="pr_purcprice" property="pr_purcprice" jdbcType="DOUBLE" />
+        <result column="pr_saleprice" property="pr_saleprice" jdbcType="DOUBLE" />
+        <result column="pr_vendid" property="pr_vendid" jdbcType="INTEGER" />
+        <result column="pr_vendcode" property="pr_vendcode" jdbcType="VARCHAR" />
+        <result column="pr_vendname" property="pr_vendname" jdbcType="VARCHAR" />
+        <result column="pr_docdate" property="pr_docdate" jdbcType="TIMESTAMP" />
+        <result column="pr_recordmanid" property="pr_recordmanid" jdbcType="INTEGER" />
+        <result column="pr_recordman" property="pr_recordman" jdbcType="VARCHAR" />
+        <result column="pr_status" property="pr_status" jdbcType="VARCHAR" />
+        <result column="pr_statuscode" property="pr_statuscode" jdbcType="VARCHAR" />
+        <result column="companyId" property="companyId" jdbcType="INTEGER" />
+        <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
+        <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
+        <result column="pr_text1" property="pr_text1" jdbcType="VARCHAR" />
+        <result column="pr_text2" property="pr_text2" jdbcType="VARCHAR" />
+        <result column="pr_text3" property="pr_text3" jdbcType="VARCHAR" />
+        <result column="pr_text4" property="pr_text4" jdbcType="VARCHAR" />
+        <result column="pr_text5" property="pr_text5" jdbcType="VARCHAR" />
+    </association>
   </resultMap>
   <sql id="Base_Column_List" >
     mm_id, mm_maid, mm_detno, mm_prodid, mm_prodcode, mm_whid, mm_whcode, mm_price, mm_oneuseqty, 
@@ -215,7 +249,7 @@
     where mm_id = #{id}
   </update>
   <select id="selectByFK" resultMap="BaseResultMap">
-    SELECT * FROM MAKEMATERIAL WHERE MM_MAID=#{id} AND COMPANYID={companyId}
+    SELECT * FROM MAKEMATERIAL LEFT JOIN PRODUCT ON PR_ID=MA_PRODID AND MAKEMATERIAL.COMPANYID=PRODUCT.COMPANYID WHERE MM_MAID=#{id} AND MAKEMATERIAL.COMPANYID={companyId}
   </select>
   <delete id="deleteByFK">
     DELETE FROM MAKEMATERIAL WHERE MM_MAID=#{id} AND COMPANYID={companyId}

+ 25 - 1
frontend/saas-web/app/view/core/dbfind/DbfindGridPanel.js

@@ -55,7 +55,7 @@ Ext.define('saas.view.core.dbfind.DbfindGridPanel', {
                 dockedItems:[{
                     xtype:'toolbar',
                     dock:'top',
-                    items:me.dbSearchFields.concat([{
+                    items:me.getSearchFields().concat([{
                         xtype:'button',
                         text:'查询',
                         handler:function(b){
@@ -136,6 +136,30 @@ Ext.define('saas.view.core.dbfind.DbfindGridPanel', {
         });
     },
 
+    getSearchFields: function() {
+        var me = this,
+        searchFields = me.dbSearchFields;
+
+        Ext.Array.each(searchFields, function(f) {
+            f.enableKeyEvents = true;
+            f.listeners = {
+                keydown: function(th, e, eOpts) {
+                    if(e.keyCode == 13) {
+                        me.condition = '', items = [];
+                        Ext.Array.each(searchFields,function(f) {
+                            var field = th.ownerCt.down('[name='+f.name+']')
+                            items.push(field);
+                        });
+                        me.condition = me.getCondition(items);
+                        me.store.loadPage(1);
+                    }
+                }
+            }
+        });
+
+        return searchFields;
+    },
+
     /**
      * 获得过滤条件
      */

+ 25 - 1
frontend/saas-web/app/view/core/dbfind/MultiDbfindGridPanel.js

@@ -82,7 +82,7 @@ Ext.define('saas.view.core.dbfind.MultiDbfindGridPanel', {
                 dockedItems:[{
                     xtype:'toolbar',
                     dock:'top',
-                    items:me.dbSearchFields.concat([{
+                    items:me.getSearchFields().concat([{
                         xtype:'button',
                         text:'查询',
                         handler:function(b){
@@ -265,6 +265,30 @@ Ext.define('saas.view.core.dbfind.MultiDbfindGridPanel', {
         me.callParent(arguments);
     },
 
+    getSearchFields: function() {
+        var me = this,
+        searchFields = me.dbSearchFields;
+
+        Ext.Array.each(searchFields, function(f) {
+            f.enableKeyEvents = true;
+            f.listeners = {
+                keydown: function(th, e, eOpts) {
+                    if(e.keyCode == 13) {
+                        me.condition = '', items = [];
+                        Ext.Array.each(searchFields,function(f) {
+                            var field = th.ownerCt.down('[name='+f.name+']')
+                            items.push(field);
+                        });
+                        me.condition = me.getCondition(items);
+                        me.store.loadPage(1);
+                    }
+                }
+            }
+        });
+
+        return searchFields;
+    },
+
      /**
      * 获得过滤条件
      */

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

@@ -120,27 +120,6 @@ Ext.define('saas.view.money.othspendings.FormPanel', {
                     var format = '0,000.' + xr.join();
                     return Ext.util.Format.number(v, format);
                 }
-            }, {
-                text : "单价", 
-                dataIndex : "sd_price", 
-                width : 120.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 8
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length)).fill('0');
-                    var format = '0,000.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                },
-                summaryType: 'sum',
-                summaryRenderer: function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length)).fill('0');
-                    var format = '0,000.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                }
             }, {
                 text : "备注", 
                 dataIndex : "osd_remark",

+ 105 - 0
frontend/saas-web/overrides/util/Collection.js

@@ -0,0 +1,105 @@
+Ext.define('saas.override.util.Collection', {
+    override: 'Ext.util.Collection',
+
+    _aggregators: {
+        average: function (items, begin, end, property, root) {
+            var n = end - begin;
+            return n &&
+                   this._aggregators.sum.call(this, items, begin, end, property, root) / n;
+        },
+ 
+        bounds: function (items, begin, end, property, root) {
+            for (var value, max, min, i = begin; i < end; ++i) {
+                value = items[i];
+                value = (root ? value[root] : value)[property];
+ 
+                // First pass max and min are undefined and since nothing is less than 
+                // or greater than undefined we always evaluate these "if" statements as 
+                // true to pick up the first value as both max and min. 
+                if (!(value < max)) { // jshint ignore:line 
+                    max = value;
+                }
+                if (!(value > min)) { // jshint ignore:line 
+                    min = value;
+                }
+            }
+ 
+            return [min, max];
+        },
+        
+        count: function(items) {
+            return items.length;
+        },
+ 
+        extremes: function (items, begin, end, property, root) {
+            var most = null,
+                least = null,
+                i, item, max, min, value;
+ 
+            for (i = begin; i < end; ++i) {
+                item = items[i];
+                value = (root ? item[root] : item)[property];
+ 
+                // Same trick as "bounds" 
+                if (!(value < max)) { // jshint ignore:line 
+                    max = value;
+                    most = item;
+                }
+                if (!(value > min)) { // jshint ignore:line 
+                    min = value;
+                    least = item;
+                }
+            }
+ 
+            return [least, most];
+        },
+ 
+        max: function (items, begin, end, property, root) {
+            var b = this._aggregators.bounds.call(this, items, begin, end, property, root);
+            return b[1];
+        },
+ 
+        maxItem: function (items, begin, end, property, root) {
+            var b = this._aggregators.extremes.call(this, items, begin, end, property, root);
+            return b[1];
+        },
+ 
+        min: function (items, begin, end, property, root) {
+            var b = this._aggregators.bounds.call(this, items, begin, end, property, root);
+            return b[0];
+        },
+ 
+        minItem: function (items, begin, end, property, root) {
+            var b = this._aggregators.extremes.call(this, items, begin, end, property, root);
+            return b[0];
+        },
+ 
+        // override
+        sum: function (items, begin, end, property, root) {
+            for (var value, sum = 0, i = begin; i < end; ++i) {
+                value = items[i];
+                value = (root ? value[root] : value)[property];
+                
+                var num1 = sum + '';
+                var num2 = value + '';
+    
+                var baseNum, baseNum1, baseNum2; 
+                try { 
+                    baseNum1 = num1.split(".")[1].length; 
+                } catch (e) { 
+                    baseNum1 = 0; 
+                } 
+                try { 
+                    baseNum2 = num2.split(".")[1].length; 
+                } catch (e) { 
+                    baseNum2 = 0;
+                } 
+                baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
+    
+                sum = (num1 * baseNum + num2 * baseNum) / baseNum;
+            }
+    
+            return sum;
+        }
+    },
+});