Browse Source

定时删除残留数据

zhongzewei 7 years atrás
parent
commit
a7367c73f5

+ 64 - 0
modules/all_models/bills.js

@@ -0,0 +1,64 @@
+/**
+ * Created by zhang on 2018/3/22.
+ */
+let mongoose = require("mongoose");
+let subSchema = require("../all_schemas/bills_sub_schemas");
+let deleteSchema = require('../all_schemas/delete_schema');
+let Schema = mongoose.Schema;
+let billsSchema = new Schema({
+    ID: String,
+    ParentID: String,
+    NextSiblingID: String,
+    projectID: Number,
+    serialNo: Number,
+    chapterID: Number,
+    billsLibId: Number,
+    code: String,
+    fullCode: String,
+    type:{type: Number,default:4},//1 :大项费用 2:分部 3分项 4清单;5补项
+    isAdd:{type: Number,default:0},//1 true 0 false是否新增
+    name: String,
+    unit: String,
+    quantity: String, // Decimal
+    quantityEXP:String,//工程量表达式
+    feeRateID:Number,
+    feeRate:String,
+    isFromDetail:{type: Number,default:0},//1 true 0 false
+    programID: Number,
+    calcBase: String,
+    calcBaseValue: String,     // 计算基数表达式的值
+    // 工程量计算规则
+    ruleText: String,
+    // 说明
+    comments: String,
+    // 调价
+    xs_Labour: String, // Decimal
+    xs_Material: String, // Decimal
+    xs_Machine: String, // Decimal
+    xs_FeeRate: String, // Decimal
+    xs_LabourPrice: String, // Decimal
+    xs_MaterialPrice: String, // Decimal
+    xs_MachinePrice: String, // Decimal
+    isTender_Labour: Boolean,
+    isTender_Material: Boolean,
+    isTender_Machine: Boolean,
+    tenderTargetPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
+    //工作内容//zhong 2017-8-31
+    jobContentText: String, //清单工作内容列显示文本, 减少第一次拉数据时的循环次数
+    jobContent: [subSchema.jobContentSchema],
+    //项目特征
+    itemCharacterText: String,//清单项目特征列显示文本
+    itemCharacter: [subSchema.itemCharacterSchema],
+    // 费用字段
+    fees: [subSchema.feesSchema],
+    // 标记字段
+    flags: [subSchema.flagsSchema],
+    installationKey:String,//用来记录安装增加费的关联字段
+    deleteInfo: deleteSchema,
+    isEstimate:{type: Number,default:0},       // 1 true 0 false 是否暂估
+    remark:String
+});
+
+mongoose.model("bills", billsSchema);

+ 41 - 0
modules/all_models/calc_program_model.js

@@ -0,0 +1,41 @@
+/**
+ * Created by CSL on 2017-10-22.
+ */
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let calcItemSchema = new Schema({
+    ID: Number,
+    code: String,
+    name: String,
+    fieldName: String,
+    dispExpr: String,
+    dispExprUser: String,
+    expression: String,
+    compiledExpr: String,
+    statement: String,
+    feeRateID: Number,
+    feeRate: String,
+    labourCoeID: Number,
+    memo: String,
+    custom: Boolean
+},{versionKey:false, _id: false});
+
+let templateSchema = new Schema({
+    ID: Number,
+    name: String,
+    calcItems: [calcItemSchema],
+    custom: Boolean
+},{versionKey:false, _id: false});
+
+
+let projectCalcPrograms = new Schema({
+    ID: String,
+    projectID: Number,
+    name: String,
+    libID: Number,
+    libName: String,
+    templates: [templateSchema]
+},{versionKey:false});
+
+mongoose.model('calc_programs', projectCalcPrograms, 'calc_programs');

+ 60 - 0
modules/all_models/fee_rates.js

@@ -0,0 +1,60 @@
+/**
+ * Created by CSL on 2017-03-29.
+ */
+
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+let deleteSchema = require('../all_schemas/delete_schema');
+// {ID:1,name:'工程分类',optionList:[{name:'一类工程',value:1,selected:true},{name:'二类工程',value:2,selected:false},{name:'三类工程',value:3,selected:false},{name:'四类工程',value:4,selected:false}]},
+let optionSchema = new Schema({
+    name:String,
+    value:String,
+    selected:Boolean
+},{versionKey:false,_id: false})
+
+let recordSchema = new Schema({
+    ID:Number,
+    name:String,
+    optionList:[optionSchema]
+},{versionKey:false,_id: false})
+
+let valueMapSchema = new Schema({
+    ID:String,
+    value:Number
+},{versionKey:false,_id: false})
+let subFeeRatesSchema = new Schema({
+    recodes :[recordSchema],
+    valueMaps:[valueMapSchema],
+},{versionKey:false,_id: false});
+
+
+let ratesSchema = new Schema({
+    ID: Number,
+    ParentID: Number,
+    name: String,
+    rate: Number,
+    memo: String,
+    subFeeRate:subFeeRatesSchema
+},{versionKey:false,_id: false});
+
+let feeRatesSchema = new Schema({
+    ID: String,
+    rates: [ratesSchema],
+    deleteInfo: deleteSchema
+},{versionKey:false});
+
+mongoose.model('fee_rates', feeRatesSchema, 'fee_rates');
+
+
+let feeRateFileSchema = new Schema({
+    ID: String,
+    rootProjectID:Number,//顶层项目ID
+    userID:String,
+    name:String,
+    libID: String,
+    libName: String,
+    feeRateID:String,//关联的费率ID
+    deleteInfo: deleteSchema
+},{versionKey:false});
+
+mongoose.model('fee_rate_file', feeRateFileSchema, 'fee_rate_file');

+ 51 - 0
modules/all_models/installation_fee.js

@@ -0,0 +1,51 @@
+/**
+ * Created by Zhong on 2017/9/13.
+ */
+import mongoose from "mongoose";
+let Schema = mongoose.Schema;
+
+//安装增加费-费用规则
+let feeRuleSchema = new Schema({
+    ID: String,
+    sectionId: String, //分册章节id
+    feeItemId:String,
+    code: String,
+    rule: String,
+    base: String,
+    feeRate: Number,
+    labour: Number,
+    material: Number,
+    machine: Number,
+    position: String,//记取位置
+    billID:String//记取位置对应的清单ID
+},{versionKey:false,_id: false});
+
+//安装增加费-分册章节
+let installSectionSchema = new Schema({
+    ID: String,
+    feeItemId: String,
+    feeRuleId: String,
+    name: String
+},{versionKey:false,_id: false});
+
+//安装增加费-费用项
+let installFeeItemSchema = new Schema({
+    ID: String,
+    feeItem: String, //费用项
+    feeType: String, //费用类型
+    position: String,//记取位置
+    billID:String,//记取位置对应的清单ID
+    isCal: {type: Number,default:0}//是否记取0:false 1:true
+},{versionKey:false,_id: false});
+
+let installationFeeSchema = new Schema({
+    ID:String,
+    libID:Number,
+    libName:String,
+    projectID:String,
+    installFeeItem:[installFeeItemSchema],
+    installSection:[installSectionSchema],
+    feeRule:[feeRuleSchema]
+},{versionKey:false});
+
+mongoose.model("installation_fee",installationFeeSchema,"installation_fee");

+ 25 - 0
modules/all_models/labour_coe_model.js

@@ -0,0 +1,25 @@
+/**
+ * Created by CSL on 2017-09-28.
+ */
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let coeSchema = new Schema({
+    ID: Number,
+    ParentID: Number,
+    name: String,
+    coe: String,
+    _id: false
+},{versionKey:false});
+
+let projectLabourCoes = new Schema({
+    ID: String,
+    projectID: Number,
+    name: String,
+    libID: Number,
+    libName: String,
+    coes: [coeSchema]//,
+   // _id: false
+},{versionKey:false});
+
+mongoose.model('labour_coes', projectLabourCoes, 'labour_coes');

+ 16 - 0
modules/all_models/proj_setting.js

@@ -0,0 +1,16 @@
+/**
+ * Created by Mai on 2017/9/14.
+ */
+
+let mongoose = require("mongoose");
+let Schema = mongoose.Schema;
+let collectionName = 'proj_setting';
+let projSettingSchema = {
+    projectID: Number,
+    // 列设置
+    main_tree_col: {
+        type: Schema.Types.Mixed,
+        default: {}
+    }
+};
+mongoose.model(collectionName, new Schema(projSettingSchema, {versionKey: false, collection: collectionName}));

+ 103 - 0
modules/all_models/project_glj.js

@@ -0,0 +1,103 @@
+/**
+ * Created by zhang on 2018/3/22.
+ */
+/**
+ * 工料机数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/6/29
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'glj_list';
+let modelSchema = {
+    // 自增id
+    id: Number,
+    // 工料机总库ID
+    glj_id: Number,
+    // 标段ID
+    project_id: Number,
+    // 编码
+    code: {
+        type: String,
+        index: true
+    },
+    //原始的编码
+    original_code: {
+        type: String,
+        index: true
+    },
+    // 名称
+    name: {
+        type: String,
+        index: true,
+        default: ''
+    },
+    // 是否暂估 (0为否 1为是)
+    is_evaluate: {
+        type: Number,
+        default: 0
+    },
+    // 供货方式
+    supply: {
+        type: Number,
+        default: 0
+    },
+    // 甲供数量
+    supply_quantity: {
+        type: Number,
+        default: 0
+    },
+    // 交货方式
+    delivery: {
+        type: String,
+        default: ''
+    },
+    // 送达地点
+    delivery_address: {
+        type: String,
+        default: ''
+    },
+    // 不调价
+    is_adjust_price: {
+        type: Number,
+        default: 0
+    },
+    // 调整系数ID
+    adjCoe: Number,
+
+    // 规格型号
+    specs: {
+        type: String,
+        default: ''
+    },
+    // 类型
+    type: Number,
+    // 单位
+    unit: String,
+    // 显示调整基价
+    adjust_price: String,
+    // 显示关联单价文件的字段
+    unit_price: Schema.Types.Mixed,
+    // 显示关联的消耗量
+    quantity: String,
+    // 显示组成物的消耗量
+    consumption: String,
+    // 显示关联配合比的id
+    mix_ratio_id: Number,
+    // 显示关联父级工料机code(组合物用)
+    connect_code: String,
+    materialType: Number,   //三材类别
+    materialCoe: Number,    //三材系数
+    // 是否主要材料 (0为否 1为是)
+    is_main_material: {
+        type: Number,
+        default: 0
+    },
+    ratio_data: Schema.Types.Mixed
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false}));
+
+

+ 35 - 0
modules/all_models/projects.js

@@ -0,0 +1,35 @@
+/**
+ * Created by Zhong on 2018/3/22.
+ */
+/*项目*/
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const deleteSchema = require('../all_schemas/delete_schema');
+
+const collectionName = 'projects';
+const ProjectSchema = new Schema({
+    "ID": Number,
+    "ParentID": Number,
+    "NextSiblingID": Number,
+    "userID": String,
+    "name": String,
+    "projType": String,
+    "recentDateTime": Date,
+    "createDateTime": Date,
+    "compilation": String,
+    "deleteInfo": deleteSchema,
+    'fullFolder': Array,
+    "property": {
+        type: Schema.Types.Mixed,
+        default: {}
+    },
+    "summaryFees":{
+        totalFee: String,
+        estimateFee: String,
+        safetyFee: String,
+        chargeFee: String
+    },
+    "changeMark":String,//更新标记  feeRate:费率文件发生了改变,unitFile 单件文件发生了改变
+    "remark":String //备注
+});
+mongoose.model(collectionName, ProjectSchema, collectionName);

+ 21 - 0
modules/all_models/quantity_detail.js

@@ -0,0 +1,21 @@
+/**
+ * Created by chen on 2017/7/20.
+ */
+
+var mongoose = require('mongoose'),
+    Schema = mongoose.Schema;
+
+var quantity_detail = new Schema({
+    ID:String,
+    projectID: Number,
+    rationID:String,
+    billID:String,
+    name:String,
+    regex:String,
+    result:Number,
+    isSummation: {type: Number,default:1},//0:false 1:true
+    referenceIndexs:[Number],
+    seq:Number
+},{versionKey:false});
+
+mongoose.model('quantity_detail', quantity_detail);

+ 71 - 0
modules/all_models/ration.js

@@ -0,0 +1,71 @@
+/**
+ * Created by zhang on 2018/3/22.
+ */
+let mongoose = require("mongoose");
+let subSchema = require("../all_schemas/bills_sub_schemas");
+let Schema = mongoose.Schema;
+let deleteSchema = require('../all_schemas/delete_schema');
+
+var rationAssItemSchema = mongoose.Schema({
+    name: String,
+    assistID: Number,
+    assistCode: String,
+    stdValue: Number,
+    actualValue:Number,
+    stepValue: String,
+    decimal: Number,
+    carryBit: String,
+    minValue: String,
+    maxValue: String
+}, { _id: false });
+
+// 定额、量价、工料机定额 合并存储
+let rationSchema = new Schema({
+    // 公用属性部分
+    ID: String,
+    projectID: Number,
+    billsItemID: String,
+    serialNo: Number,
+    code: String,
+    name: String,
+    unit: String,
+    quantity: String,
+    contain:String,//含量
+    quantityEXP:String,//工程量表达式
+    programID: Number,
+    marketUnitFee: String,
+    marketTotalFee: String,
+    fees: [subSchema.feesSchema],
+    deleteInfo: deleteSchema,
+    type: Number,                               // 1 定额、2 量价、3 工料机定额
+    subType: Number,                            // 子类型:1人工、201材料、301机械、4主材、5设备
+    from:{type: String,default:'std'},          //std, cpt  来自标准、补充
+    isSubcontract: Boolean,                     // 是否分包
+    installationKey:String,                   //用来记录安装增加费的关联字段
+
+    // 定额特有属性:
+    libID: Number,
+    maskName: String,
+    caption: String,
+    isFromDetail:{type: Number,default:0},       // 1 true 2 false
+    adjustState: String,
+    rationProjName: String,
+    comments: String,                           // 说明
+    flags: [subSchema.flagsSchema],             // 标记字段
+    rationAssList: [rationAssItemSchema],
+    content: String,                            // 工作内容
+    ruleText: String,                            // 计算规则
+    prefix: {type: String, default: ''},                              //定额是补充、借用时用  补 借
+
+    //工料机特有属性
+    projectGLJID:Number,  //项目工料机ID
+    GLJID:Number,//工料机库ID
+    original_code:String, //原始编码
+    specs:String,//规格型号
+    shortName:String,//缩写
+    customQuantity:String,//自定义消耗
+    adjCoe:Number,
+    remark:String
+});
+
+let ration = mongoose.model("ration", rationSchema, "ration");

+ 28 - 0
modules/all_models/ration_coe.js

@@ -0,0 +1,28 @@
+/**
+ * Created by chen on 2017/6/29.
+ */
+var mongoose = require('mongoose'),
+    Schema = mongoose.Schema;
+
+var coeSchema = mongoose.Schema({
+    coeType: String,                // 系数类型,指作用范围:// 单个(如:111量0.001)、人工类、材料类、机械类、全部(如:定额×0.925)。
+    gljCode: String,                  // 要调整的工料机ID(当coeType=0时有效)
+    operator: String,               // 运算符(*、+、-、=)
+    amount: Number,                 // 调整的量
+    _id: false
+});
+
+var coeListSchema = mongoose.Schema({
+    libID: Number,                      // 所属定额库ID
+    ID: String,                         // 系数ID(流水号ID)
+    name: String,                       // 名称
+    content: String,                    // 说明
+    rationID:String,
+    projectID:Number,
+    coeID:Number,
+    isAdjust:Number, //0不调整,1调整
+    seq:Number,//序数,排序用
+    coes: [coeSchema]
+}, {versionKey: false});
+
+mongoose.model('ration_coe', coeListSchema);

+ 36 - 0
modules/all_models/ration_glj.js

@@ -0,0 +1,36 @@
+/**
+ * Created by chen on 2017/6/29.
+ */
+var mongoose = require('mongoose'),
+    Schema = mongoose.Schema;
+
+var ration_glj = new Schema({
+    ID:String,
+    GLJID:Number,
+    repositoryId:Number,
+    projectID: Number,
+    rationID:String,
+    projectGLJID:Number,
+    name:String,
+    code:String,
+    //原始的编码
+    original_code: {
+        type: String,
+        index: true
+    },
+    rcode:String,
+    specs:String,
+    unit:String,
+    shortName:String,
+    billsItemID: String,
+    type:Number,
+    // 调整系数ID
+    adjCoe: Number,
+    quantity:String,
+    customQuantity:String,
+    rationItemQuantity:String,
+    createType: {type: String,default:'normal'},//normal、add、replace  正常、添加工料机、替换工料机
+    from:{type: String,default:'std'}//std, cpt  来自标准工料机库、补充工料机库
+},{versionKey:false});
+
+mongoose.model('ration_glj', ration_glj);

+ 21 - 0
modules/all_models/ration_installation.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/2/8.
+ */
+
+var mongoose = require('mongoose'),
+    Schema = mongoose.Schema;
+
+var ration_installation = new Schema({
+    ID:String,
+    libID:Number,
+    projectID: Number,
+    rationID:String,
+    sectionId: String, //分册章节id
+    feeItemId:String,
+    ruleId:String,
+    itemName:String,
+    sectionName:String,
+    unifiedSetting:{type: Number,default:1},//0:false 1:true  按统一设置
+},{versionKey:false});
+
+mongoose.model('ration_installation', ration_installation,"ration_installation");

+ 55 - 0
modules/all_models/unit_price.js

@@ -0,0 +1,55 @@
+/**
+ * 具体单价数据结构
+ *
+ * @author CaiAoLin
+ * @date 2017/6/29
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'unit_price';
+let modelSchema = {
+    // 自增ID
+    id: Number,
+    // 基价单价
+    base_price: String,
+    // 市场单价
+    market_price: String,
+    // 编码
+    code: {
+        type: String,
+        index: true
+    },
+    //原始的编码
+    original_code: {
+        type: String,
+        index: true
+    },
+    // 名称
+    name: {
+        type: String,
+        index: true
+    },
+    // 规格型号
+    specs: {
+        type: String,
+        default: ''
+    },
+    // 单位
+    unit: String,
+    // 类型
+    type: Number,
+    // 类型简称
+    short_name: String,
+    // 单价文件表id
+    unit_price_file_id: Number,
+    // 对应标准库工料机id
+    glj_id: Number,
+    //是否新增1为是,0为否
+    is_add:{
+        type: Number,
+        default: 0
+    }
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 28 - 0
modules/all_models/unit_price_file.js

@@ -0,0 +1,28 @@
+/**
+ * 具体单价数据结构
+ *
+ * @author CaiAoLin
+ * @date 2017/6/29
+ * @version
+ */
+import mongoose from "mongoose";
+let deleteSchema = require('../all_schemas/delete_schema');
+let Schema = mongoose.Schema;
+let collectionName = 'unit_price_file';
+let modelSchema = {
+    // 自增id
+    id: Number,
+    // 标段id
+    project_id: {
+        type: Number,
+        index: true
+    },
+    // 显示名称
+    name: String,
+    // 所属用户id
+    user_id: String,
+    // 顶层projectId
+    root_project_id: Number,
+    deleteInfo: deleteSchema
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 48 - 0
modules/all_schemas/bills_sub_schemas.js

@@ -0,0 +1,48 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var Schema = mongoose.Schema;
+
+// 费用字段
+var feesSchema = new Schema({
+    fieldName: String,
+    unitFee: String, // Decimal. 单价
+    totalFee: String, // Decimal. 合价
+    tenderUnitFee: String, // Decimal. 调价后单价
+    tenderTotalFee: String // Decimal. 调价后合价
+});
+
+// 标记字段
+var flagsSchema = new Schema({
+    fieldName: String,
+    flag: Number
+});
+
+var changesSchema = new Schema({
+    addGLJ: String,
+    modifyGLJ:String,
+    deleteGLJ:String
+});
+
+//add by Zhong2017-8-30
+//清单工作内容字段
+let jobContentSchema = new Schema({
+    content: String, //工作内容
+    serialNo: Number, //排序用
+    isChecked: Boolean //是否勾选(输出)
+}, {_id: false});
+//特征值字段
+let eigenvalueSchema = new Schema({
+    value: String,
+    isSelected: Boolean //判断哪个特征值被选中
+}, {_id: false});
+//项目特征字段
+let itemCharacterSchema = new Schema({
+    character: String, //特征
+    serialNo: Number, //排序用
+    eigenvalue: [eigenvalueSchema],//特征值
+    isChecked: Boolean //是否勾选(输出)
+}, {_id: false});
+
+module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema};

+ 3 - 2
modules/all_schemas/delete_schema.js

@@ -5,11 +5,12 @@
 var mongoose = require("mongoose");
 var Schema = mongoose.Schema;
 
-// ·ÑÓÃ×Ö¶Î
+
 var deleteSchema = new Schema({
     deleted: Boolean,
+    completeDeleted: {type: Boolean, default: false},
     deleteDateTime: Date,
-    deleteBy: Number // userID
+    deleteBy: String // userID
 });
 
 module.exports = deleteSchema;

+ 31 - 0
modules/sys_tools/controllers/sys_controller.js

@@ -0,0 +1,31 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2018/5/24
+ * @version
+ */
+
+import BaseController from "../../common/base/base_controller";
+//import sysSchedule from '../models/sys_model';
+let sysSchedule = require('../models/sys_model');
+let callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+};
+class SysTools extends BaseController{
+    clearJunkData(req, res){
+        sysSchedule.clearJunkData(function (err) {
+            let msg = '清除成功';
+            let errCode = 0;
+            if(err){
+                msg = '清除失败';
+                errCode = 1;
+            }
+            callback(req, res, errCode, msg, null);
+        });
+    }
+}
+
+export {SysTools as default};

+ 137 - 0
modules/sys_tools/models/sys_model.js

@@ -0,0 +1,137 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2018/5/24
+ * @version
+ */
+
+import mongoose from 'mongoose';
+import schedule from 'node-schedule';
+import async from 'async';
+const projectModel = mongoose.model('projects');
+const projSettingModel = mongoose.model('proj_setting');
+const calcProgramModel = mongoose.model('calc_programs');
+const labourCoeModel = mongoose.model('labour_coes');
+const billsModel = mongoose.model('bills');
+const rationModel = mongoose.model('ration');
+const projGljModel = mongoose.model('glj_list');
+const rationGljModel = mongoose.model('ration_glj');
+const rationCoeMolde = mongoose.model('ration_coe');
+const installationModel = mongoose.model('installation_fee');
+const rationInstallationModel = mongoose.model('ration_installation');
+const quantityDetailModel = mongoose.model('quantity_detail');
+const unitPriceFileModel = mongoose.model('unit_price_file');
+const unitPriceModel = mongoose.model('unit_price');
+const feeRateFileModel = mongoose.model('fee_rate_file');
+const feeRateModel = mongoose.model('fee_rates');
+
+//删除垃圾数据
+async function clearJunkData(callback){
+    let functions = [];
+    //获取彻底删除了的项目
+    let junkProjs = await projectModel.find({'deleteInfo.deleted': true, 'deleteInfo.completeDeleted': true});
+    let junkProjIds = [];
+    for(let jProj of junkProjs){
+        junkProjIds.push(jProj.ID);
+    }
+    if(junkProjIds.length > 0){
+        //清除proj_setting
+        functions.push(function(cb){
+            projSettingModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除calcProgram
+        functions.push(function(cb){
+            calcProgramModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除labourCoe
+        functions.push(function(cb){
+            labourCoeModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除bills
+        functions.push(function(cb){
+            billsModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除ration
+        functions.push(function(cb){
+            rationModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除project_glj
+        functions.push(function(cb){
+            projGljModel.remove({project_id: {$in: junkProjIds}}, cb);
+        });
+        //清除ration_glj
+        functions.push(function(cb){
+            rationGljModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除ration_coe
+        functions.push(function(cb){
+            rationCoeMolde.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除installation_fee
+        functions.push(function(cb){
+            installationModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除ration_installation
+        functions.push(function(cb){
+            rationInstallationModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+        //清除quantity_detail
+        functions.push(function(cb){
+            quantityDetailModel.remove({projectID: {$in: junkProjIds}}, cb);
+        });
+    }
+    //彻底删除了的单价文件
+    let junkUFs = await unitPriceFileModel.find({'deleteInfo.deleted': true, 'deleteInfo.completeDeleted': true});
+    let junkUFIds = [];
+    for(let jUF of junkUFs){
+        junkUFIds.push(jUF.id);
+    }
+    if(junkUFIds.length > 0){
+        functions.push(function(cb){
+            unitPriceModel.remove({unit_price_file_id: {$in: junkUFIds}}, cb);
+        });
+        functions.push(function(cb){
+            unitPriceFileModel.remove({id: {$in: junkUFIds}}, cb);
+        });
+    }
+    //彻底删除了的费率文件
+    let junkFFs = await feeRateFileModel.find({'deleteInfo.deleted': true, 'deleteInfo.completeDeleted': true});
+    let junkFFIds = [];
+    for(let jFF of junkFFs){
+        junkFFIds.push(jFF.feeRateID);
+    }
+    if(junkFFIds.length > 0){
+        functions.push(function(cb){
+            feeRateModel.remove({ID: {$in: junkFFIds}}, cb);
+        });
+        functions.push(function(cb){
+            feeRateFileModel.remove({feeRateID: {$in: junkFFIds}}, cb);
+        });
+    }
+    //清除
+    if(functions.length > 0){
+        async.parallel(functions, async function(err, result){
+            if(!err){
+                //清除项目
+                await projectModel.remove({ID: {$in: junkProjIds}});
+            }
+            if(callback){
+                callback(err);
+            }
+        });
+    }
+    else {
+        callback(0);
+    }
+
+}
+
+const sysSchedule = {
+    clearJunkData: clearJunkData
+};
+
+//export {sysSchedule as default}
+module.exports = sysSchedule;

+ 21 - 0
modules/sys_tools/routes/routes.js

@@ -0,0 +1,21 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2018/5/24
+ * @version
+ */
+import express from "express";
+import SysToolsController from "../controllers/sys_controller";
+
+let router = express.Router();
+let sysToolsController = new SysToolsController();
+
+module.exports = function (app) {
+    router.post('/clearJunkData', sysToolsController.auth, sysToolsController.init, sysToolsController.clearJunkData);
+
+    app.use("/sysTools/api", router);
+
+};

+ 17 - 0
operation.js

@@ -1,4 +1,5 @@
 let express = require('express');
+import schedule from 'node-schedule';
 
 let config = require("./config/config.js");
 config.setupDb(process.env.NODE_ENV);
@@ -64,6 +65,8 @@ app.use(function (req, res, next) {
     let referer = '';
     if (!/^\/login/.test(req.originalUrl) && !req.session.managerData) {
         if (/\/api/.test(req.originalUrl)) {
+            console.log(`req.originalUrl`);
+            console.log(req.originalUrl);
             referer = URL.parse(req.headers.referer);
             return res.redirect('/login' + '?referer=' + referer.path);
         } else {
@@ -95,6 +98,20 @@ fs.readFile(__dirname + '/public/web/date_util.js', 'utf8', 'r', function (err,
     // console.log(dt.Format('yyyy 年 M 月 20 日'));
 });
 
+//定时任务
+let sysSchedule = require('./modules/sys_tools/models/sys_model');
+schedule.scheduleJob({hour: 3, minute: 30, dayOfWeek: 7}, function(){
+    sysSchedule.clearJunkData(function (err) {
+        if(err){
+            console.log('清除失败');
+        }
+        else{
+            console.log('清除成功');
+        }
+    })
+});
+
+
 app.listen(6080, function(){
     console.log("server started!");
 });

+ 2 - 1
package.json

@@ -28,7 +28,8 @@
     "multiparty": "^4.1.3",
     "node-xlsx": "^0.11.2",
     "pdfkit": "^0.8.2",
-    "ueditor": "^1.2.3"
+    "ueditor": "^1.2.3",
+    "node-schedule": "^1.3.0"
   },
   "scripts": {
     "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd operation.js"

+ 9 - 9
web/maintain/bills_lib/scripts/db_controller.js

@@ -42,7 +42,7 @@ var dbController = {
             else {
                 let updateNode = controller.tree.roots[controller.tree.roots.length - 1];
                 let updateId = updateNode.getID();
-                //let newNodeId = controller.tree.newNodeID();
+                //let newNodeId = controllers.tree.newNodeID();
                 let newNodeId = uuid.v1();
                 let updatePreData = {ID: updateId, NextSiblingID: newNodeId};
                 let sectionInfo = tools.getSectionInfo(node);
@@ -1856,12 +1856,12 @@ var jobsController = {
         totalJobs.jobsArr.forEach(function(job){
             if(field === 'content'&& newData === job.data.content){
                 let serialNo = tools.getSerialNo(controller.tree.selected.jobs);//update--
-                //billsAjax.updateBills(billsLibId, controller.tree.selected.getID(), 'jobs', job.data.id);//update--
+                //billsAjax.updateBills(billsLibId, controllers.tree.selected.getID(), 'jobs', job.data.id);//update--
                 billsAjax.updateBills(userAccount, billsLibId, controller.tree.selected.getID(), 'jobs', {id: job.data.id, serialNo: serialNo});//update--
                 job.count++;
-               // controller.tree.selected.jobs.push(job);//update--
+               // controllers.tree.selected.jobs.push(job);//update--
                 controller.tree.selected.jobs.push({job: job, serialNo: serialNo});//update--
-                //tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
+                //tools.reshowData(sheet, controllers.tree.selected.jobs, setting, true);//update--
                 tools.orderReshowData(sheet,controller.tree.selected.jobs, setting, 'job', true);
             }
             else if(field == 'code' && newData == job.data.code){
@@ -1869,7 +1869,7 @@ var jobsController = {
                 billsAjax.updateBills(userAccount, billsLibId, controller.tree.selected.getID(), 'jobs', {id: job.data.id, serialNo: serialNo});//update--
                 job.count++;
                 controller.tree.selected.jobs.push({job: job, serialNo: serialNo});//update--
-               // tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
+               // tools.reshowData(sheet, controllers.tree.selected.jobs, setting, true);//update--
                 tools.orderReshowData(sheet, controller.tree.selected.jobs, setting, 'job', true);
             }
         });
@@ -1893,7 +1893,7 @@ var jobsController = {
                     controller.tree.selected.jobs.splice(index, 1);
                     controller.tree.selected.jobs.splice(index, 0, {job: job, serialNo: serialNo});//update--
                     billsAjax.updateBillsArr(userAccount, billsLibId, controller.tree.selected.getID(), id, job.data.id, 'update', 'jobs');
-                   // tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
+                   // tools.reshowData(sheet, controllers.tree.selected.jobs, setting, true);//update--
                     tools.orderReshowData(sheet,controller.tree.selected.jobs, setting, 'job', true);
                 }
             });
@@ -1901,7 +1901,7 @@ var jobsController = {
         else{
             if(field === 'content'){
                 maxJobsNumber++;
-                //let serialNo = tools.getSerialNo(controller.tree.selected.jobs);//update--
+                //let serialNo = tools.getSerialNo(controllers.tree.selected.jobs);//update--
                 let serialNo = tools.getObj(controller.tree.selected.jobs, id, 'job').serialNo;
                 jobsAjax.edUpdateJob(userAccount, billsLibId, controller.tree.selected.getID(), newData, maxJobsNumber, id, function(newJobId){//update--
                     var newJobData, newJob;
@@ -1913,7 +1913,7 @@ var jobsController = {
                     var index = tools.getIndex(controller.tree.selected.jobs, id, 'job');
                     controller.tree.selected.jobs.splice(index, 1);
                     controller.tree.selected.jobs.splice(index, 0, {job: newJob, serialNo: serialNo});//update--
-                    //tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
+                    //tools.reshowData(sheet, controllers.tree.selected.jobs, setting, true);//update--
                     tools.orderReshowData(sheet, controller.tree.selected.jobs, setting, 'job', true);//update--
                 });
             }
@@ -2056,7 +2056,7 @@ var itemsController = {
                 totalItems.items[totalItems.prefix + newItemId] = newItem;
                 totalItems.itemsArr.push(newItem);
                 controller.tree.selected.items.push({item: newItem, serialNo: serialNo});
-                //tools.reshowData(sheet, controller.tree.selected.items, setting, true);
+                //tools.reshowData(sheet, controllers.tree.selected.items, setting, true);
                 tools.orderReshowData(sheet, controller.tree.selected.items, setting, 'item', true);
             });
         }

+ 4 - 4
web/maintain/bills_lib/scripts/set_sheets.js

@@ -120,7 +120,7 @@ var myKey = {
                 let classifyStr = classify === 'jobs' ? 'job' : 'item';
                 tools.deleteELes(controller.tree.selected[classify], ids, classifyStr);
                     //deleteFrontData
-                    //tools.reshowData(sheet, controller.tree.selected[classify], setting, true);
+                    //tools.reshowData(sheet, controllers.tree.selected[classify], setting, true);
                     //deleteDB
                     billsAjax.updateBillsArr(userAccount, billsLibId, controller.tree.selected.getID(), ids, null, 'delete', classify, function(){
                         tools.orderReshowData(sheet, controller.tree.selected[classify], setting, classifyStr, true);
@@ -128,9 +128,9 @@ var myKey = {
                     /*if(result.length > 0){
                         if(classify === 'jobs'){
                             /!*result.forEach(function(id){
-                                controller.tree.selected.jobs.forEach(function(obj){
+                                controllers.tree.selected.jobs.forEach(function(obj){
                                     if(id === obj.job.data.id){
-                                        controller.tree.selected.jobs.splice(obj);
+                                        controllers.tree.selected.jobs.splice(obj);
                                     }
                                 });
                                 /!*if(totalObj.findJob(id)){
@@ -139,7 +139,7 @@ var myKey = {
                                 }*!/
                             });*!/
                             //jobsAjax.deleteJobContent(billsLibId, result);
-                            tools.orderReshowData(sheet, controller.tree.selected.jobs, setting, 'job', true);
+                            tools.orderReshowData(sheet, controllers.tree.selected.jobs, setting, 'job', true);
                         }
                         else {
                             result.forEach(function(id){

+ 49 - 1
web/users/views/tool/index.html

@@ -30,6 +30,54 @@
                         <a href="/stdGljRepository/main" class="btn btn-primary pull-right">进入</a></h2>
                 </div>
             </div>
+            <div class="col-xs-6 mb-30 ">
+                <div class="c-body">
+                    <h2>清除项目残留数据
+                        <a href="javascript:void(0);" id="clearJunkBtn" class="btn btn-primary pull-right">清除</a></h2>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--弹出 是否清除数据-->
+<div class="modal fade" id="clearJunkModal" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <div id="delete_showinfo">
+                        <label>确认要清除数据库中项目残留数据吗?</label>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer" style="justify-content: center">
+                <button type="button" class="btn btn-primary"  data-dismiss="modal" id="clearJunkY" >是</button>
+                <button type="button" class="btn btn-primary"  data-dismiss="modal">否</button>
+            </div>
         </div>
     </div>
-</div>
+</div>
+
+<script type="text/javascript" src="/public/web/common_ajax.js"></script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript">
+    $(document).ready(function () {
+        $('#clearJunkBtn').click(function () {
+            $('#clearJunkModal').modal('show');
+        });
+        $('#clearJunkY').click(function () {
+            $.bootstrapLoading.start();
+             CommonAjax.post('/sysTools/api/clearJunkData', '', function (rstData) {
+             $.bootstrapLoading.end();
+             }, function () {
+             $.bootstrapLoading.end();
+             })
+        });
+    });
+</script>