Browse Source

1.修改工料机相关逻辑

caiaolin 8 years ago
parent
commit
7899c07b83

+ 48 - 5
modules/common/base/base_model.js

@@ -44,15 +44,58 @@ class BaseModel {
     /**
      * 根据id查找对应数据
      *
-     * @param {string} id
+     * @param {Object} condition
+     * @param {Object} fields
+     * @param {boolean} singleData
      * @return {Promise}
      */
-    async findDataById(id) {
-        if (id === '' || id === undefined) {
+    async findDataByCondition(condition, fields = null, singleData = true) {
+        if (Object.keys(condition).length <= 0) {
             return null;
         }
-        let data = await this.db.findOne({_id: id});
-        console.log(data);
+
+        let data = await singleData ? this.db.findOne(condition, fields) : this.db.find(condition);
+        return data;
+    }
+
+    /**
+     * 根据条件返回数据数量
+     *
+     * @param {object} condition
+     * @return {Promise}
+     */
+    async count(condition = null) {
+        let total = 0;
+        try {
+            total = await this.db.count(condition);
+        } catch (error) {
+            total = 0;
+        }
+        return total;
+    }
+
+    /**
+     * 根据id删除
+     *
+     * @param {Number} id
+     * @return {Promise}
+     */
+    async deleteById(id) {
+        let result = false;
+        id = parseInt(id);
+        if (isNaN(id) || id <= 0) {
+            return false;
+        }
+
+        try {
+            let deleteResult = await this.db.delete({id: id});
+            result = deleteResult.result.ok === 1;
+        } catch (error) {
+            console.log(error);
+            result = false;
+        }
+
+        return result;
     }
 
 }

+ 38 - 0
modules/common/helper/mongoose_helper.js

@@ -122,6 +122,44 @@ class MongooseHelper {
         });
     }
 
+    /**
+     * 统计数据数量
+     *
+     * @param {Object} condition
+     * @return {Promise}
+     */
+    count(condition) {
+        let self = this;
+        return new Promise(function(resolve, reject) {
+            self.model.count(condition, function(error, data) {
+                if (error) {
+                    reject(error);
+                } else {
+                    resolve(data);
+                }
+            });
+        });
+    }
+
+    /**
+     * 删除数据
+     *
+     * @param {Object} condition
+     * @return {Promise}
+     */
+    delete(condition) {
+        let self = this;
+        return new Promise(function(resolve, reject) {
+            self.model.remove(condition, function(error, data) {
+                if (error) {
+                    reject(error);
+                } else {
+                    resolve(data);
+                }
+            });
+        });
+    }
+
 }
 
 export default MongooseHelper;

+ 54 - 4
modules/glj/controllers/glj_controller.js

@@ -7,6 +7,7 @@
  */
 import BaseController from "../../common/base/base_controller";
 import GLJListModel from "../models/glj_list_model";
+import UnitPriceModel from "../models/unit_price_model";
 
 class GLJController extends BaseController {
 
@@ -53,7 +54,7 @@ class GLJController extends BaseController {
     }
 
     /**
-     * 测试插入
+     * 模拟定额插入
      *
      * @param {object} request
      * @param {object} response
@@ -62,7 +63,7 @@ class GLJController extends BaseController {
     async test(request, response) {
         // 从定额库获取的数据
         let data = {
-            gli_repository_id: 1,
+            glj_repository_id: 1,
             project_id: 1,
             tender_id: 1,
             code: '00010201',
@@ -70,11 +71,13 @@ class GLJController extends BaseController {
             specs: '',
             unit: '工日',
             type: 2,
-            type_of_work: 2
+            type_of_work: 2,
+            base_price: 38.88,
+            market_price: 38.88
         };
         try {
             let gljListModel = new GLJListModel();
-            let result = await gljListModel.addData(data);
+            let result = await gljListModel.addList(data);
 
             console.log(result);
         } catch (error) {
@@ -84,6 +87,53 @@ class GLJController extends BaseController {
         response.end('success');
     }
 
+    /**
+     * 模拟定额修改单价
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async testModify(request, response) {
+        let tenderId = request.query.tender;
+        // 修改数据
+        let updateData = {
+            code: '00010201',
+            market_price: '40',
+            name: '土石方综合工日',
+            tender_id: tenderId,
+            project_id: 1
+        };
+        let unitPriceTenderId = 1;
+        try {
+            let unitPriceModel = new UnitPriceModel();
+            let result = await unitPriceModel.updateUnitPrice(updateData, unitPriceTenderId);
+
+            console.log(result);
+        } catch (error) {
+            console.log(error);
+        }
+        response.end('success');
+    }
+
+    /**
+     * 测试删除
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async delete(request, response) {
+        try {
+            let gljListModel = new GLJListModel();
+            let result = await gljListModel.deleteById(63);
+
+            console.log(result);
+        } catch (error) {
+            console.log(error);
+        }
+        response.end('success');
+    }
 }
 
 export default GLJController;

+ 55 - 15
modules/glj/models/glj_list_model.js

@@ -40,13 +40,11 @@ class GLJListModel extends BaseModel {
         switch (scene) {
             // 新增数据的验证规则
             case 'add':
-                this.model.schema.path('gli_repository_id').required(true);
+                this.model.schema.path('glj_repository_id').required(true);
                 this.model.schema.path('project_id').required(true);
                 this.model.schema.path('tender_id').required(true);
-                this.model.schema.path('unit').required(true);
                 this.model.schema.path('code').required(true);
                 this.model.schema.path('name').required(true);
-                this.model.schema.path('type').required(true);
                 this.model.schema.path('type_of_work').required(true);
                 break;
         }
@@ -99,34 +97,76 @@ class GLJListModel extends BaseModel {
             if (glj.code === undefined) {
                 continue;
             }
-            glj.unit_price = unitPriceList[glj.code] !== undefined ? unitPriceList[glj.code] : null;
-            glj.adjust_price = glj.adjustment * glj.unit_price.base_price;
+            glj.unit_price = unitPriceList[glj.code + glj.name] !== undefined ? unitPriceList[glj.code + glj.name] : null;
+            glj.adjust_price = glj.adjustment * glj.unit_price.market_price;
         }
     }
 
     /**
-     * 新增工料机数据(定额工料机新增时调用)
+     * 新增项目工料机数据(包括新增单价文件) 定额工料机新增时调用
      *
      * @param {object} data
-     * @return {Promise} 返回插入成功的数据
+     * @return {Promise} 返回插入成功的数据id
      */
-    async addData(data) {
-        let result = false;
+    async addList(data) {
+        let result = null;
         try {
             if (Object.keys(data).length <= 0) {
                 throw '新增数据为空';
             }
-            // 新增自增id
-            let counterModel = new CounterModel();
-            data.id = await counterModel.getId(gljCollectionName);
-            this.setScene('add');
-            result = await this.db.model.create(data);
+            // 首先查找是否有同编码同名称的工料机数据
+            let projectGljData = await this.findDataByCondition({code: data.code, tender_id: data.tender_id});
+            if (projectGljData && projectGljData.id > 0) {
+                // 如果找到数据则直接返回
+                return projectGljData;
+            }
+
+            // 新增单条记录 (两个操作本来应该是事务操作,然而mongodb事务支持比较弱,就当作是都可以顺利执行)
+            let gljInsertData = await this.add(data);
+            if (!gljInsertData) {
+                throw '新增项目工料机失败!';
+            }
+
+            // 获取标段属性中的单价文件关联标段id @todo
+            let unitPriceTenderId = 1;
+
+            // 新增单价文件
+            let unitPriceModel = new UnitPriceModel();
+            let unitPriceInsertData = await unitPriceModel.updateUnitPrice(data, unitPriceTenderId);
+
+            if (!unitPriceInsertData) {
+                throw '新增单价失败!';
+            }
+
+            gljInsertData.unit_price = unitPriceInsertData;
+            result = gljInsertData;
         } catch (error) {
-            result = false;
+            console.log(error);
+            result = null;
         }
 
         return result;
     }
+
+    /**
+     * 新增单条工料机数据
+     *
+     * @param {object} data
+     * @return {Promise}
+     */
+    async add(data) {
+        if (Object.keys(data).length <= 0) {
+            throw '新增数据为空';
+        }
+
+        let counterModel = new CounterModel();
+        data.id = await counterModel.getId(gljCollectionName);
+
+        this.setScene('add');
+        let result = await this.db.model.create(data);
+        return result;
+    }
+
 }
 
 export default GLJListModel;

+ 0 - 8
modules/glj/models/schemas/glj.js

@@ -22,14 +22,6 @@ let modelSchema = {
     code: String,
     // 名称
     name: String,
-    unit: String,
-    // 规格型号
-    specs: {
-        type: String,
-        default: ''
-    },
-    // 类型
-    type: Number,
     // 人工工种
     type_of_work: Number,
     // 是否暂估 (0为否 1为是)

+ 15 - 3
modules/glj/models/schemas/unit_price.js

@@ -21,7 +21,19 @@ let modelSchema = {
     // 市场单价
     market_price: String,
     // 编码
-    code: String
-};
+    code: String,
+    // 名称
+    name: String,
+    // 规格型号
+    specs: {
+        type: String,
+        default: ''
+    },
+    // 单位
+    unit: String,
+    // 类型
+    type: Number,
 
-export default mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
+};
+let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 161 - 3
modules/glj/models/unit_price_model.js

@@ -5,8 +5,10 @@
  * @date 2017/6/30
  * @version
  */
-import BaseModel from "../../common/base/base_model";
-import UnitPriceSchema from "./schemas/unit_price";
+import BaseModel from "../../common/base/base_model"
+import CounterModel from "./counter_model"
+import GLJListModel from "./glj_list_model";
+import {default as UnitPriceSchema, collectionName as collectionName} from "./schemas/unit_price";
 
 class UnitPriceModel extends BaseModel {
 
@@ -41,7 +43,163 @@ class UnitPriceModel extends BaseModel {
         // 整理数据
         let result = {};
         for(let tmp of unitPriceList) {
-            result[tmp.code] = tmp;
+            result[tmp.code + tmp.name] = tmp;
+        }
+
+        return result;
+    }
+
+    /**
+     * 设置场景
+     *
+     * @param {string} scene
+     * @return {void}
+     */
+    setScene(scene = '') {
+        switch (scene) {
+            // 新增数据的验证规则
+            case 'add':
+                this.model.schema.path('project_id').required(true);
+                this.model.schema.path('tender_id').required(true);
+                this.model.schema.path('base_price').required(true);
+                this.model.schema.path('market_price').required(true);
+                this.model.schema.path('name').required(true);
+                this.model.schema.path('code').required(true);
+                this.model.schema.path('unit').required(true);
+                this.model.schema.path('type').required(true);
+        }
+    }
+
+    /**
+     * 新增单价文件
+     *
+     * @param {Object} data
+     * @return {Promise}
+     */
+    async addData(data) {
+        let result = false;
+        try {
+            // 首先查找是否有相同的记录
+            let unitPriceData = await this.db.model.findOne({code: data.code, market_price: data.market_price});
+            if (unitPriceData && unitPriceData.id > 0) {
+                return true;
+            }
+
+            // 没有则新增数据
+            result = this.db.model.create(data);
+        } catch (error) {
+            result = false;
+        }
+
+        return result;
+    }
+
+    /**
+     * 更新单价文件(定额中修改价格时调用)
+     *
+     * @param {Object} data
+     * @param {Number} unitPriceTenderId
+     * @return {Promise}
+     */
+    async updateUnitPrice(data, unitPriceTenderId) {
+        if (data.code === undefined || data.tender_id === undefined || data.name === undefined
+            || data.market_price === undefined) {
+            return null;
+        }
+        let marketPrice = data.market_price !== undefined ? data.market_price : data.base_price;
+
+        // 先查找是否有同code的单价记录 @todo 后续可能会加入单位这个字段进一步确定唯一性
+        let unitPriceData = await this.findDataByCondition({code: data.code, tender_id: unitPriceTenderId}, null, false);
+
+        // 如果有记录,判断是否存在一样的市场单价,有则直接返回数据
+        if (unitPriceData && this.isPriceIncluded(unitPriceData, data.market_price)) {
+            return unitPriceData;
+        }
+
+        // 如果不存在基价单价,则在数据源中获取
+        if (data.base_price === undefined) {
+            let firstUnitPrice = unitPriceData[0] !== undefined ? unitPriceData[0] : [];
+            data.base_price = firstUnitPrice.base_price !== undefined ? firstUnitPrice.base_price : 0;
+            data.type = firstUnitPrice.type !== undefined ? firstUnitPrice.type : 0;
+            data.unit = firstUnitPrice.unit !== undefined ? firstUnitPrice.unit : 0;
+        }
+
+        let insertData = {
+            code: data.code,
+            base_price: data.base_price,
+            market_price: marketPrice,
+            project_id: data.project_id,
+            tender_id: unitPriceTenderId,
+            name: data.name,
+            type: data.type,
+            unit: data.unit
+        };
+
+        // 统计当前同code的数量
+        let sameCount = await this.count({code: data.code});
+
+        if (sameCount > 0) {
+            // 如果存在有别的同code的数据,则新增一条项目工料机,并更改name
+            let regular = /\(\d\)/;
+            let changeString = '(' + sameCount + ')';
+            insertData.name = regular.test(insertData.name) ? insertData.name.replace(regular, changeString) :
+                insertData.name + changeString;
+
+            // 然后再插入一条项目工料机数据
+            let gljListModel = new GLJListModel();
+            // 首先先查找原有数据
+            let originalData = await gljListModel.findDataByCondition({code: data.code, tender_id: data.tender_id}, {_id: 0});
+
+            // 查不到数据直接抛出错误
+            if(!originalData) {
+                throw '没有找到code为:' + data.code + '的数据';
+            }
+
+            // 新增一条新name的项目工料机
+            originalData.name = insertData.name;
+            // 这里由于查出来的数据带有隐藏属性,所以先用json转一下
+            originalData = JSON.stringify(originalData);
+            let addGLJResult = await gljListModel.add(JSON.parse(originalData));
+            if (!addGLJResult) {
+                throw '新增工料机数据失败!';
+            }
+        }
+
+        return this.add(insertData);
+    }
+
+    /**
+     * 新增记录
+     *
+     * @param {object} data
+     * @return {Promise}
+     */
+    async add(data) {
+        let counterModel = new CounterModel();
+        let unitPriceId = await counterModel.getId(collectionName);
+        data.id = unitPriceId;
+
+        this.setScene('add');
+        return this.db.model.create(data);
+    }
+
+    /**
+     * 判断数据中是否包含某个市场价格的记录
+     *
+     * @param {Array} data
+     * @param {Number} price
+     * @return boolean
+     */
+    isPriceIncluded(data, price) {
+        let result = false;
+        if (data.length <= 0) {
+            return result;
+        }
+
+        for(let tmp of data) {
+            if (tmp.market_price === price) {
+                return true;
+            }
         }
 
         return result;

+ 2 - 0
modules/glj/routes/glj_router.js

@@ -14,5 +14,7 @@ let gljController = new GLJController();
 // action定义区域
 router.get('/', gljController.init, gljController.index);
 router.get('/test', gljController.init, gljController.test);
+router.get('/testModify', gljController.init, gljController.testModify);
+router.get('/testDelete', gljController.init, gljController.delete);
 
 module.exports = router;

+ 10 - 9
modules/main/models/project_glj.js

@@ -2,6 +2,7 @@
  * Created by jimiz on 2017/4/1.
  * 工料机汇总
  */
+/*
 var mongoose = require("mongoose");
 var db = require("../db/project_db");
 var Schema = mongoose.Schema;
@@ -9,8 +10,8 @@ var deleteSchema = require('../../../public/models/delete_schema');
 var consts = require('./project_consts');
 var projectConsts = consts.projectConst;
 var commonConsts = consts.commonConst;
-var unitPriceFile = require('../../glj/models/unit_price_file');
-var upGLJList = require('../../glj/models/glj_list');
+var unitPriceFile = require('../../glj_bak/models/unit_price_file');
+var upGLJList = require('../../glj_bak/models/glj_list');
 var projectProperties = require('./project_properties.js')
 
 var projectGLJSchema = new Schema({
@@ -94,16 +95,15 @@ projectGLJDAO.prototype.save = function(projectID, datas, callback){
                 case commonConsts.UT_UPDATE:
                     projectGLJ.update({ID: doc.ID}, doc, cb);
                     break;
-                case commonConsts.UT_DELETE:
-                /* 假删除
-                 var item = new ration(doc);
-                 item.remove(cb);
-                 */
+                // commonConsts.UT_DELETE:
+                 // 假删除
+                 // var item = new ration(doc);
+                 // item.remove(cb);
+
             }
         }
     }
     for (var i = 0; i < datas.length; i++){
-        data = datas[i];
         functions.push(saveOne(data));
     }
 
@@ -121,4 +121,5 @@ projectGLJDAO.prototype.syncData = function(projectID, datas, callback){
 
 };
 
-module.exports = new projectGLJDAO();
+module.exports = new projectGLJDAO();
+ */

+ 3 - 3
web/glj/js/glj_index.js

@@ -10,10 +10,10 @@ $(document).ready(function () {
     let header = [
         {name: '编码', field: 'code', visible: true},
         {name: '名称', field: 'name', visible: true},
-        {name: '规格型号', field: 'specs', visible: true},
-        {name: '单位', field: 'unit', visible: true},
+        {name: '规格型号', field: 'unit_price.specs', visible: true},
+        {name: '单位', field: 'unit_price.unit', visible: true},
         {name: 'ID', field: 'id', visible: false},
-        {name: '类型', field: 'type', visible: false},
+        {name: '类型', field: 'unit_price.type', visible: false},
         {name: '人工工种', field: 'type_of_work', visible: false},
         {name: '总消耗量', field: '', visible: true},
         {name: '基价单价', field: "unit_price.base_price", visible: true},