|
@@ -0,0 +1,205 @@
|
|
|
+'use strict';
|
|
|
+const Schema = require('mongoose').Schema;
|
|
|
+const metaPlugin = require('naf-framework-mongoose/lib/model/meta-plugin');
|
|
|
+// 签收数据
|
|
|
+const arriveList = new Schema({
|
|
|
+ name: { type: String, maxLength: 200 }, // 货物名
|
|
|
+ number: { type: Number, maxLength: 200 }, // 数量
|
|
|
+ weight: { type: Number, maxLength: 200 }, // 重量
|
|
|
+ volume: { type: Number, maxLength: 200 }, // 体积
|
|
|
+ time: { type: String, maxLength: 200 }, // 收货时间
|
|
|
+ remark: { type: String, maxLength: 200 },
|
|
|
+});
|
|
|
+// 货物列表
|
|
|
+const goods = new Schema({
|
|
|
+ name: { type: String, maxLength: 200 }, // 货物名
|
|
|
+ number: { type: Number, maxLength: 200 }, // 数量
|
|
|
+ weight: { type: Number, maxLength: 200 }, // 重量
|
|
|
+ volume: { type: Number, maxLength: 200 }, // 体积
|
|
|
+ remark: { type: String, maxLength: 200 },
|
|
|
+});
|
|
|
+
|
|
|
+// 拆分货物
|
|
|
+// 刚生成订单,货物数据同时进入货物列表和拆分列表时,type为0;
|
|
|
+// 之后所有拆分生成的数据,type都是1
|
|
|
+const splitGoods = new Schema({
|
|
|
+ name: { type: String, maxLength: 200 }, // 货物名
|
|
|
+ number: { type: Number, maxLength: 200, default: 0 }, // 数量
|
|
|
+ weight: { type: Number, maxLength: 200 }, // 重量
|
|
|
+ volume: { type: Number, maxLength: 200 }, // 体积
|
|
|
+ remark: { type: String, maxLength: 200 },
|
|
|
+ pid: { type: String, maxLength: 200, required: true }, // 来源id;type为0时,从goods中去找;1时,就都是这个文档的事了
|
|
|
+ type: { type: String, maxLength: 200, default: '0' }, // 0=>原始数据;1=>拆分数据,
|
|
|
+ status: { type: String, maxLength: 200, default: '0' }, // 0=>未装车; 1=>运输中; 2=>已到达
|
|
|
+});
|
|
|
+
|
|
|
+// 订单
|
|
|
+const order = {
|
|
|
+ order_no: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '订单号', filter: true },
|
|
|
+ },
|
|
|
+ owner: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '订单创建人' },
|
|
|
+ },
|
|
|
+ client: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '客户' },
|
|
|
+ },
|
|
|
+ rq_send_time: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '要求发货日期' },
|
|
|
+ },
|
|
|
+ send_time: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '发货日期' },
|
|
|
+ },
|
|
|
+ rq_arrive_time: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '要求到达日期' },
|
|
|
+ },
|
|
|
+ // 到达日期有问题:应该有多种货物不同到达日期 或 某种货物被拆分,不同的到达日期
|
|
|
+ // 但是这并不影响要求 到达日期
|
|
|
+ arrive: {
|
|
|
+ type: [ arriveList ],
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '到达日期' },
|
|
|
+ },
|
|
|
+ pre_money: {
|
|
|
+ type: String,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '预售金额', type: 'number' },
|
|
|
+ },
|
|
|
+ goods: {
|
|
|
+ type: [ goods ],
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: {
|
|
|
+ label: '货物',
|
|
|
+ remark: '只用来记录货物最开始的情况,一旦进行拆分,则不允许更改',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ split: {
|
|
|
+ type: [ splitGoods ],
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: {
|
|
|
+ label: '货物拆分列表',
|
|
|
+ remark: '货物录入后,同时进入这里,这里的货物供拆分使用',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ goods_bill: {
|
|
|
+ type: Array,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '货物收入单据' },
|
|
|
+ },
|
|
|
+ in_bill: {
|
|
|
+ type: Array,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '收入-服务单据' },
|
|
|
+ },
|
|
|
+ out_bill: {
|
|
|
+ type: Array,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: { label: '支出-服务单据' },
|
|
|
+ },
|
|
|
+ transport_bill: {
|
|
|
+ type: Array,
|
|
|
+ required: true,
|
|
|
+ maxLength: 200,
|
|
|
+ field: {
|
|
|
+ label: '运输支出单据',
|
|
|
+ remark: `主要问题在这,这里的运输单据要映射到运输表中;且可以修改;有可能有多条数据,比如此单是往返单,货物可能一开始没有填全,只填了去的货物,而途中,此单可能变成单程单,之后可能空车回来或者参与其他单.
|
|
|
+ 还可能此单原来是单程单,之后需要在这单上加些货物回来,就变成往返单,或可以运输结束的单子
|
|
|
+ 还有可能是:此单需要多段运输,每段运输都需要记录
|
|
|
+ `,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ is_js: {
|
|
|
+ type: String,
|
|
|
+ maxLength: 200,
|
|
|
+ default: '0',
|
|
|
+ field: {
|
|
|
+ label: '结算状态',
|
|
|
+ filter: 'select',
|
|
|
+ type: 'radio',
|
|
|
+ format: (i => (i === '0' ? '未结算' : '已结算')).toString(),
|
|
|
+ list: [
|
|
|
+ { label: '未结算', value: '0' },
|
|
|
+ { label: '已结算', value: '1' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ goods_status: {
|
|
|
+ type: String,
|
|
|
+ maxLength: 200,
|
|
|
+ default: '0',
|
|
|
+ field: {
|
|
|
+ label: '货物状态',
|
|
|
+ filter: 'select',
|
|
|
+ type: 'radio',
|
|
|
+ remark: `查看拆分列表中
|
|
|
+ 1)所有的货物状态都为0 => 未发车
|
|
|
+ 2)至少1个0,其余全为1,没有2=> 部分货物未发车 ; 部分运输中
|
|
|
+ 3)至少1个0,至少1个1,至少1个2=> 部分货物未发车 ; 部分运输中 ; 部分货物已到达
|
|
|
+ 4)至少1个0,没有1,其余全为2=> 部分货物未发车 ; 部分货物已到达
|
|
|
+ 5)没有0,全为1,没有2 => 所有货物运输中
|
|
|
+ 4)没有0,至少1个1,其余全为2 => 所有货物运输中 ; 部分货物已到达
|
|
|
+ 6)没有0,没有1,全为2 => 所有货物已到达
|
|
|
+ `,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ status: {
|
|
|
+ type: String,
|
|
|
+ maxLength: 200,
|
|
|
+ default: '0',
|
|
|
+ field: {
|
|
|
+ label: '状态',
|
|
|
+ filter: 'select',
|
|
|
+ type: 'radio',
|
|
|
+ format: (i => (i === '0' ? '正常' : '冻结')).toString(),
|
|
|
+ list: [
|
|
|
+ { label: '正常', value: '0' },
|
|
|
+ { label: '冻结', value: '1' },
|
|
|
+ ],
|
|
|
+ remark: '冻结时不允许操作和此单有关的信息,运输改变货物及订单状态部分除外',
|
|
|
+ },
|
|
|
+ }, // 状态:0=>使用;1禁用
|
|
|
+ remark: {
|
|
|
+ type: String,
|
|
|
+ required: false,
|
|
|
+ maxLength: 200,
|
|
|
+ field: {
|
|
|
+ label: '备注',
|
|
|
+ type: 'textarea',
|
|
|
+ options: { autosize: { minRows: 3, maxRows: 5 } },
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+const schema = new Schema(order, { toJSON: { virtuals: true } });
|
|
|
+schema.index({ id: 1 });
|
|
|
+schema.plugin(metaPlugin);
|
|
|
+
|
|
|
+module.exports = app => {
|
|
|
+ const { mongoose } = app;
|
|
|
+ return mongoose.model('Order', schema, 'order');
|
|
|
+};
|