snow преди 2 години
родител
ревизия
0eb5e2d6bf
променени са 24 файла, в които са добавени 1093 реда и са изтрити 71 реда
  1. 47 0
      src/api/netOrderEnter/netOrderEntry/index.ts
  2. 0 15
      src/components/ReconciliationForm/src/_options.ts
  3. 4 4
      src/components/ReconciliationForm/src/cpns/purchase-modal.vue
  4. 2 2
      src/components/ReconciliationForm/src/cpns/purchase-table.vue
  5. 1 1
      src/config/status.ts
  6. 5 0
      src/modules/modal.ts
  7. 3 3
      src/store/modules/user.ts
  8. 1 1
      src/utils/status.ts
  9. 1 2
      src/views/InvoiceSales/invoiceApply/status.ts
  10. 10 0
      src/views/InvoiceSales/sheetOrderPool/config/content.config.ts
  11. 67 0
      src/views/netOrderEnter/netOrderEntry/components/category.vue
  12. 39 0
      src/views/netOrderEnter/netOrderEntry/components/company.vue
  13. 30 0
      src/views/netOrderEnter/netOrderEntry/components/customer.vue
  14. 38 0
      src/views/netOrderEnter/netOrderEntry/components/supplier.vue
  15. 255 0
      src/views/netOrderEnter/netOrderEntry/config/_options.ts
  16. 94 0
      src/views/netOrderEnter/netOrderEntry/config/content.config.ts
  17. 32 0
      src/views/netOrderEnter/netOrderEntry/config/search.config.ts
  18. 53 0
      src/views/netOrderEnter/netOrderEntry/index.vue
  19. 401 0
      src/views/netOrderEnter/netOrderEntry/qrd-modal.vue
  20. 0 15
      src/views/purchase/porder/config/_options.ts
  21. 2 2
      src/views/purchase/porder/config/content.config.ts
  22. 0 15
      src/views/supply/porder/config/_options.ts
  23. 2 2
      src/views/supply/porder/config/content.config.ts
  24. 6 9
      src/views/system/menuOperator/components/edit-dialog.vue

+ 47 - 0
src/api/netOrderEnter/netOrderEntry/index.ts

@@ -0,0 +1,47 @@
+import { http } from "/@/utils/http";
+import { loadEnv } from "@build/index";
+const { VITE_PROXY_DOMAIN_REAL, VITE_PROXY_USER_REAL } = loadEnv();
+const userAPi = VITE_PROXY_DOMAIN_REAL;
+const yewuApi = VITE_PROXY_USER_REAL + "/admin/";
+
+export const httpList = (data: object): any => {
+  return http.request("post", `${yewuApi}interlist`, {
+    data
+  });
+};
+
+
+export const httpUserList = (): any => {
+  return http.request("post", `${yewuApi}userall`, { data: {} });
+};
+export const httpCreate = (data): any => {
+  return http.request("post", `${yewuApi}interadd`, { data });
+};
+export const httpUpdate = (data): any => {
+  return http.request("post", `${yewuApi}interedit`, { data });
+};
+export const httpDetail = (data): any => {
+  return http.request("post", `${yewuApi}interinfo`, { data });
+}
+
+export const httpRatelist = (): any => {
+  return http.request("post", `${yewuApi}getrate`, { data: {} });
+}
+
+export const httpCustomerlist = (data): any => {
+  return http.request("post", `${yewuApi}customerlist`, { data });
+};
+
+export const httpCompanylist = (data): any => {
+  return http.request("post", `${yewuApi}companylist`, { data });
+};
+
+export const httpSupplierlist = (data): any => {
+  return http.request("post", `${yewuApi}supplierlist`, { data });
+};
+export const httpCategorylist = (data): any => {
+  return http.request("post", `${yewuApi}intercat`, { data });
+};
+
+
+

+ 0 - 15
src/components/ReconciliationForm/src/_options.ts

@@ -1,18 +1,3 @@
-export const cgdTypeOptions = [
-  {
-    value: "1",
-    label: "库存"
-  },
-  {
-    value: "2",
-    label: "非库存"
-  },
-  {
-    value: "3",
-    label: "咨询"
-  }
-];
-
 export const selectOptions = [
   { value: "sequenceNo", label: "采购单编号" },
   { value: "goodNo", label: "商品编号" },

+ 4 - 4
src/components/ReconciliationForm/src/cpns/purchase-modal.vue

@@ -3,8 +3,8 @@ import { ElTable } from "element-plus";
 import { reactive, ref, unref } from "vue";
 import { useAsync } from "/@/hooks/core/useAsync";
 import { httpCgdList } from "/@/api/purchase/orderRecord";
-import { send_status_list, cg_order_source_options } from "/@/utils/status";
-import { cgdTypeOptions, selectOptions as _selectOptions } from "../_options";
+import { send_status_list, cg_order_source_options, cg_order_type_options } from "/@/utils/status";
+import { selectOptions as _selectOptions } from "../_options";
 import { INPUT_MAX_LENGTH } from "/@/utils/global";
 import { useCompany } from "/@/hooks/core/useCompany";
 
@@ -162,7 +162,7 @@ defineExpose({
             clearable
           >
             <ElOption
-              v-for="c in cgdTypeOptions"
+              v-for="c in cg_order_type_options"
               :key="c.value"
               :label="c.label"
               :value="c.value"
@@ -256,7 +256,7 @@ defineExpose({
           <template #="{ row }">
             <ElTag>
               {{
-                cgdTypeOptions.find(t => t.value === String(row.cgdType))?.label
+                cg_order_type_options.find(t => t.value === String(row.cgdType))?.label
               }}
             </ElTag>
           </template>

+ 2 - 2
src/components/ReconciliationForm/src/cpns/purchase-table.vue

@@ -1,9 +1,9 @@
 <script setup lang="ts">
 import { ref, computed } from "vue";
 import { ElMessage } from "element-plus";
-import { cgdTypeOptions } from "../_options";
 import { CG_ORDER_SOURCE_OPTIONS, SEND_STATUS_OPTIONS } from "/@/config/status";
 import PurchaseModal from "./purchase-modal.vue";
+import { cg_order_type_options } from "/@/utils/status";
 
 const emit = defineEmits(["push", "delete", "choose"]);
 
@@ -128,7 +128,7 @@ function handleAddPurchase() {
           <template #="{ row }">
             <ElTag>
               {{
-                cgdTypeOptions.find(t => t.value === String(row.cgdType))?.label
+                cg_order_type_options.find(t => t.value === String(row.cgdType))?.label
               }}
             </ElTag>
           </template>

+ 1 - 1
src/config/status.ts

@@ -1,7 +1,7 @@
 //采购单 来源
 export const CG_ORDER_SOURCE_OPTIONS = [
   { value: "0", label: "备库单" },
-  // { value: "1", label: "直接下单" },
+  { value: "1", label: "直接下单" },
   { value: "2", label: "竞价转单" },
   { value: "3", label: "项目转单" },
   { value: "4", label: "平台导入" },

+ 5 - 0
src/modules/modal.ts

@@ -0,0 +1,5 @@
+export enum ModalTypes {
+  create,
+  update,
+  preview
+}

+ 3 - 3
src/store/modules/user.ts

@@ -129,9 +129,9 @@ export const useUserStore = defineStore({
           ({ companyNo }) => companyNo === code
         );
 
-        this.currentCompany = this.isSuperUser
-          ? ""
-          : this.companyList[index >= 0 ? index : 0];
+        this.currentCompany = !this.isSuperUser
+          ? this.companyList[index >= 0 ? index : 0]
+          : ""
       } else {
         throw new Error();
       }

+ 1 - 1
src/utils/status.ts

@@ -29,7 +29,7 @@ const xs_order_type_options = [
 ];
 const cg_order_source_options = [
   { value: "0", label: "备库单" },
-  // { value: "1", label: "直接下单" },
+  { value: "1", label: "直接下单" },
   { value: "2", label: "竞价转单" },
   { value: "3", label: "项目转单" },
   { value: "4", label: "平台导入" },

+ 1 - 2
src/views/InvoiceSales/invoiceApply/status.ts

@@ -34,7 +34,7 @@ const xs_order_type_options = [
 ];
 const cg_order_source_options = [
   { value: "0", label: "备库单" },
-  // { value: "1", label: "直接下单" },
+  { value: "1", label: "直接下单" },
   { value: "2", label: "竞价转单" },
   { value: "3", label: "项目转单" },
   { value: "4", label: "平台导入" },
@@ -44,7 +44,6 @@ const cg_order_source_options = [
   { value: "8", label: "支付渠道" }
 ];
 const open_type_list = [
-  // { value: "0", label: "备库单" },
   { value: "1", label: "金税开票金税验票" },
   { value: "2", label: "金税开票线下验票" },
   { value: "3", label: "线下开票线下验票" }

+ 10 - 0
src/views/InvoiceSales/sheetOrderPool/config/content.config.ts

@@ -28,6 +28,16 @@ const columns = [
     fixed: "left",
     width: 160
   },
+  {
+    label: "卖方公司编码",
+    prop: "companyNo",
+    width: 160
+  },
+  {
+    label: "卖方公司名称",
+    prop: "companyName",
+    minWidth: 160
+  },
   {
     label: "客户编号",
     prop: "customerNo",

+ 67 - 0
src/views/netOrderEnter/netOrderEntry/components/category.vue

@@ -0,0 +1,67 @@
+<script setup lang="ts">
+import { ref } from "vue";
+import type { CascaderProps } from 'element-plus';
+import { httpCategorylist } from "/@/api/netOrderEnter/netOrderEntry";
+import { useResponseHandle } from '/@/hooks/core/useAsync';
+import { useVModel } from "@vueuse/core";
+
+const props = defineProps<{
+  modelValue?:string
+}>()
+
+const emit = defineEmits(['change'])
+const responseHandle = useResponseHandle();
+const categorys = ref<Array<Record<string, string>>[]>([]);
+
+const value = useVModel(props,'modelValue')
+
+const cascaderProps: CascaderProps = {
+  lazy: true,
+  async lazyLoad(node, resolve) { 
+    const { level, value: id } = node;
+    const { data, message, code } = await httpCategorylist({
+      ...(id ? { pid: id } : {})
+    });
+
+    responseHandle({
+      code,
+      message,
+      handler: () => {
+        categorys.value[level] = data;
+
+        const nodes = data.map(({ cat_name: label, id: value}) => ({
+          value,
+          label,
+          leaf:level >= 2
+        }))
+
+        resolve(nodes)
+      }
+    })
+  }
+}
+
+function handleChange(values:Array<string>) {
+  let index = 0;
+  const categoryValue:Array<Record<string,string>> = []
+
+  while (index++ <= values.length - 1) { 
+    const idx = index - 1;
+    const _id = values[idx];
+    const findNode = categorys.value[idx].find(({ id }) => id === _id);
+    categoryValue.push(findNode)
+  }
+
+  emit("change",categoryValue);
+}
+
+</script>
+
+<template>
+  <ElCascader 
+    v-model="value" 
+    style="width: 100%;" 
+    :props="cascaderProps"
+    @change="handleChange" 
+  />
+</template>

+ 39 - 0
src/views/netOrderEnter/netOrderEntry/components/company.vue

@@ -0,0 +1,39 @@
+<script setup lang="ts">
+import { ref ,watchEffect } from "vue"
+import { useVModel } from "@vueuse/core";
+import RemoteSelect from '/@/components/RemoteSelect';
+import { httpSupplierlist } from "/@/api/netOrderEnter/netOrderEntry";
+import { ElMessage } from "element-plus";
+
+const props = defineProps<{
+  modelValue?: string;
+}>();
+
+const value = useVModel(props, 'modelValue');
+
+const RemoteSelectRef = ref<InstanceType<typeof RemoteSelect> | null>(null)
+
+defineExpose({
+  initalData:(data) => (RemoteSelectRef.value as any).initalData(data)
+})
+
+
+watchEffect(() => { 
+  if (value.value.indexOf('QS') === -1) return;
+  value.value = "";
+  
+  ElMessage.warning("请选择非供应商公司");
+})
+</script>
+
+<template>
+  <RemoteSelect 
+    ref="RemoteSelectRef"
+    v-model="value" 
+    style="width:100%;" 
+    :api="httpSupplierlist"
+    requset-prop="name"
+    response-label-prop="name" 
+    response-val-prop="code" 
+  />
+</template>

+ 30 - 0
src/views/netOrderEnter/netOrderEntry/components/customer.vue

@@ -0,0 +1,30 @@
+<script setup lang="ts">
+import { ref } from "vue"
+import { useVModel } from "@vueuse/core";
+import RemoteSelect from '/@/components/RemoteSelect';
+import { httpCustomerlist } from "/@/api/netOrderEnter/netOrderEntry";
+
+const props = defineProps<{
+  modelValue?: string;
+}>();
+
+const value = useVModel(props, 'modelValue');
+
+const RemoteSelectRef = ref<InstanceType<typeof RemoteSelect> | null>(null)
+
+defineExpose({
+  initalData:(data) => (RemoteSelectRef.value as any).initalData(data)
+})
+</script>
+
+<template>
+  <RemoteSelect 
+    ref="RemoteSelectRef"
+    v-model="value" 
+    style="width:100%;" 
+    :api="httpCustomerlist"
+    requset-prop="companyName"
+    response-label-prop="companyName" 
+    response-val-prop="companyNo" 
+  />
+</template>

+ 38 - 0
src/views/netOrderEnter/netOrderEntry/components/supplier.vue

@@ -0,0 +1,38 @@
+<script setup lang="ts">
+import { ref, watchEffect } from "vue"
+import { useVModel } from "@vueuse/core";
+import RemoteSelect from '/@/components/RemoteSelect';
+import { httpSupplierlist } from "/@/api/netOrderEnter/netOrderEntry";
+import { ElMessage } from "element-plus";
+
+const props = defineProps<{
+  modelValue?: string;
+}>();
+
+const value = useVModel(props, 'modelValue');
+const RemoteSelectRef = ref<InstanceType<typeof RemoteSelect> | null>(null)
+
+
+watchEffect(() => { 
+  if (value.value.indexOf('GS') === -1) return;
+  value.value = "";
+  ElMessage.warning("请选择供应商公司");
+})
+
+
+defineExpose({
+  initalData:(data) => (RemoteSelectRef.value as any).initalData(data)
+})
+</script>
+
+<template>
+  <RemoteSelect 
+    v-model="value" 
+    ref="RemoteSelectRef"
+    style="width:100%;" 
+    :api="httpSupplierlist"
+    requset-prop="name"
+    response-label-prop="name" 
+    response-val-prop="code" 
+  />
+</template>

+ 255 - 0
src/views/netOrderEnter/netOrderEntry/config/_options.ts

@@ -0,0 +1,255 @@
+export const formRules = {
+  sale_name: [
+    {
+      required: true,
+      message: "销售员不能为空!",
+      trigger: "blur",
+    },
+  ],
+  department: [
+    {
+      required: true,
+      message: "销售员部门不能为空!",
+      trigger: "change",
+    },
+  ],
+  buyerid: [
+    {
+      required: true,
+      message: "采购员不能为空!",
+      trigger: "change",
+    },
+  ],
+  buy_depart: [
+    {
+      required: true,
+      message: "采购员部门不能为空!",
+      trigger: "change",
+    },
+  ],
+  cgd_tax: [
+    {
+      required: true,
+      message: "采购毛利率",
+      trigger: "blur",
+    },
+  ],
+  cat_f: [
+    {
+      required: true,
+      message: "商品分类",
+      trigger: "change",
+    },
+  ],
+  supplierNo: [
+    {
+      required: true,
+      message: "供应商公司",
+      trigger: "change",
+    },
+  ],
+  qrdType: [
+    {
+      required: true,
+      message: "订单类型",
+      trigger: "blur",
+    },
+  ],
+  good_total: [
+    {
+      required: true,
+      message: "货款总金额",
+      trigger: "blur",
+    },
+  ],
+  sequenceNo: [
+    {
+      required: true,
+      message: "单据号",
+      trigger: "blur",
+    },
+  ],
+  poCode: [
+    {
+      required: true,
+      message: "PO编号",
+      trigger: "blur",
+    },
+  ],
+  workCode: [
+    {
+      required: true,
+      message: "购买方公司",
+      trigger: "change",
+    },
+  ],
+  tax: [
+    {
+      required: true,
+      message: "税率",
+      trigger: "change",
+    },
+  ],
+  companyNo: [
+    {
+      required: true,
+      message: "销售方公司",
+      trigger: "change",
+    },
+  ],
+  contactor: [
+    {
+      required: true,
+      message: "收货人",
+      trigger: "blur",
+    },
+  ],
+  mobile: [
+    {
+      required: true,
+      trigger: "blur",
+    },
+  ],
+  addr: [
+    {
+      required: true,
+      message: "联系地址",
+      trigger: "blur",
+    },
+  ],
+
+  sendtime: [
+    {
+      required: true,
+      message: "发货时间",
+      trigger: "change",
+    },
+  ],
+
+  goodName: [
+    {
+      required: true,
+      message: "商品名称",
+      trigger: "blur",
+    },
+  ],
+  goodPrice: [
+    {
+      required: true,
+      message: "单价",
+      trigger: "blur",
+    },
+  ],
+  goodNum: [
+    {
+      required: true,
+      message: "数量",
+      trigger: "blur",
+    },
+  ],
+}
+
+
+export const saleDepartOptions = [
+  {
+    status: "1",
+    value: "网络部",
+  },
+  {
+    status: "1",
+    value: "客服部",
+  },
+  {
+    status: "0",
+    value: "项目部",
+  },
+  {
+    status: "0",
+    value: "平台部",
+  },
+  {
+    status: "0",
+    value: "财务部",
+  },
+  {
+    status: "0",
+    value: "采购部",
+  },
+  {
+    status: "0",
+    value: "产品部",
+  },
+]
+
+
+export const purchaseDepartOptions = [
+  {
+    status: "1",
+    value: "网络部",
+  },
+  {
+    status: "1",
+    value: "采购部",
+  },
+  {
+    status: "0",
+    value: "客服部",
+  },
+  {
+    status: "0",
+    value: "项目部",
+  },
+  {
+    status: "0",
+    value: "平台部",
+  },
+  {
+    status: "0",
+    value: "财务部",
+  },
+
+  {
+    status: "0",
+    value: "产品部",
+  },
+]
+
+export const qrdTypeOptions = [
+  {
+    value: '1',
+    label: '库存销售'
+  },
+  {
+    value: '2',
+    label: '非库存'
+  },
+  {
+    value: '3',
+    label: '咨询'
+  }
+]
+
+
+export const defaultData = {
+  sale_id: "",
+  sale_name: "",
+  companyNo: "",
+  poCode: "",
+  workCode: "",
+  qrdType: "2",
+  goodName: "",
+  tax: "",
+  goodNum: "",
+  goodPrice: "",
+  addr: "",
+  mobile: "",
+  contactor: "",
+  buyerid: "",
+  sendtime: "",
+  cat: [],
+  supplierNo: "",
+  cgd_tax: "",
+  sale_depart: "",
+  cgd_depart: "",
+  khNo: ""
+}

+ 94 - 0
src/views/netOrderEnter/netOrderEntry/config/content.config.ts

@@ -0,0 +1,94 @@
+import { ContentConfig } from "/@/components/PageContent";
+import { httpList } from "/@/api/netOrderEnter/netOrderEntry";
+
+const columns = [
+  {
+    type: "selection",
+    minWidth: 55,
+    align: "left",
+    hide: ({ checkList }) => !checkList.includes("勾选列")
+  },
+  {
+    label: "序号",
+    type: "index",
+    minWidth: 60,
+    align: "left",
+    hide: ({ checkList }) => !checkList.includes("序号列")
+  },
+  {
+    type: "expand",
+    label: "",
+    slot: "expand",
+  },
+  {
+    prop: "orderCode",
+    label: "确认单编号",
+    width: "165px",
+    // fixed: "left",
+  },
+  {
+    prop: "sale_name",
+    label: "业务员",
+    width: "70px",
+  },
+  {
+    prop: "khNo",
+    label: "企业客户编码",
+    width: "125px",
+  },
+  {
+    prop: "khName",
+    label: "企业客户",
+    "min-width": "190px",
+  },
+  {
+    prop: "companyNo",
+    label: "确认单销售公司编码",
+    width: "175px",
+  },
+  {
+    prop: "companyName",
+    label: "确认单销售公司",
+    "min-width": "190px",
+  },
+
+  {
+    prop: "cgdNo",
+    label: "采购单号",
+    width: "165px",
+  },
+  {
+    prop: "supplierNo",
+    label: "供应商编号",
+    width: "140px",
+  },
+  {
+    prop: "supplierName",
+    label: "供应商",
+    "min-width": "190px",
+  },
+  {
+    prop: "ordertime",
+    label: "创建时间",
+    width: "140px",
+  },
+  {
+    prop: "",
+    label: "操作",
+    width: "85px",
+    slot: "operation"
+  }
+];
+
+const contentConfig: ContentConfig = {
+  title: "订单对账查询",
+  columns,
+  // superUserNoAction: true,
+  apis: {
+    httpList,
+    httpAdd: true,
+    httpUpdate: true
+  }
+};
+
+export default contentConfig;

+ 32 - 0
src/views/netOrderEnter/netOrderEntry/config/search.config.ts

@@ -0,0 +1,32 @@
+import { FormConfig } from "/@/components/PageSearch";
+
+const searchFormConfig: FormConfig = {
+  formItems: [
+    {
+      field: "group",
+      type_field: "group_type",
+      type: "input_group",
+      otherOptions: {
+        inputGroupOptions: [
+          { value: "qrdNo", label: "确认单编号" },
+          { value: "cgdNo", label: "采购单编号" },
+          { value: "sale_name", label: "销售员" },
+          { value: "cgd_saler", label: "采购员" }
+        ]
+      }
+    },
+    {
+      field: "timer",
+      type: "date_picker",
+      otherOptions: {
+        type: "daterange",
+        startProp: "starttime",
+        endProp: "endtime",
+        startPlaceholder: "订单生成时间起始",
+        endPlaceholder: "订单生成时间结束"
+      }
+    }
+  ]
+};
+
+export default searchFormConfig;

+ 53 - 0
src/views/netOrderEnter/netOrderEntry/index.vue

@@ -0,0 +1,53 @@
+<script setup lang="ts">
+import { ref } from "vue";
+import contentConfig from "./config/content.config";
+import searchConfig from "./config/search.config";
+import { usePageSearch, type PageHooks, type PageEvents } from "/@/hooks/page";
+import { ModalTypes } from "/@/modules/modal";
+import QrdModal from "./qrd-modal.vue"
+
+const PageName = "netOrderEnter";
+const qrdModalRef = ref<InstanceType<typeof QrdModal> | null>(null)
+const pageContentRef = ref<any>(null)
+
+const hooks: PageHooks = {
+  pageSearchHook: () => usePageSearch(undefined, undefined, searchConfig)
+};
+
+const events: PageEvents = {
+  content: {
+    preview: ({ id }) => qrdModalRef.value.onDisplay(ModalTypes.preview, id),
+    update: ({ id }) => qrdModalRef.value.onDisplay(ModalTypes.update, id),
+    create: () => qrdModalRef.value.onDisplay(ModalTypes.create)
+  }
+};
+</script>
+
+<template>
+  <PageAuth :pageName="PageName">
+    <PageContainer
+      :hooks="hooks"
+      :events="events"
+      :contentConfig="contentConfig"
+      :search-config="searchConfig"
+      :get-content-ref="ref => pageContentRef = ref"
+    >
+    <template #expand="row">
+       <div style="padding: 0 60px;box-sizing:border-box;">
+         <ElDescriptions :column="2">
+           <ElDescriptionsItem label="商品名称">{{row.goodName}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="部门">{{row.sale_depart}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="单价">{{row.goodPrice}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="数量">{{row.goodNum}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="单据号">{{row.workCode}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="PO编号">{{row.poCode}}</ElDescriptionsItem>
+           <ElDescriptionsItem label="税点">{{row.tax}}%</ElDescriptionsItem>
+           <ElDescriptionsItem label="确认单类型">非库存</ElDescriptionsItem>
+         </ElDescriptions>
+       </div>
+    </template>
+  </PageContainer>
+
+    <QrdModal ref="qrdModalRef" @reload="() => pageContentRef.onSearch()" />
+  </PageAuth>
+</template>

+ 401 - 0
src/views/netOrderEnter/netOrderEntry/qrd-modal.vue

@@ -0,0 +1,401 @@
+<script setup lang="ts">
+import { ref, computed } from "vue";
+import { ElForm, ElMessage } from "element-plus";
+import { ModalTypes } from "/@/modules/modal";
+import { useAsync } from "/@/hooks/core/useAsync";
+
+import { httpUserList, httpRatelist, httpCreate, httpUpdate, httpDetail } from "/@/api/netOrderEnter/netOrderEntry"
+import { formRules, saleDepartOptions, purchaseDepartOptions, qrdTypeOptions, defaultData } from "./config/_options"
+
+import Company from "./components/company.vue";
+import Customer from "./components/customer.vue";
+import Supplier from "./components/supplier.vue";
+import Category from "./components/category.vue";
+
+const emit = defineEmits(['reload']);
+
+const visible = ref(false);
+const modalType = ref<ModalTypes>(ModalTypes.create);
+const customerRef = ref<InstanceType<typeof Customer> | null>(null)
+const supplierRef = ref<InstanceType<typeof Supplier> | null>(null)
+const companyRef = ref<InstanceType<typeof Company> | null>(null)
+
+const disabledDate = (time: Date) => time.getTime() > new Date().valueOf();
+
+const formRef = ref<InstanceType<typeof ElForm> | null>(null)
+const formData = ref<Record<string, any>>({ ...defaultData })
+
+function onSuccess() { 
+  visible.value = false;
+  emit('reload');
+}
+
+function onRequsetDetailSuccess(data: Record<string, string>) {
+  const keys = Object.keys(data);
+  const numberField = ['goodNum', 'goodPrice', 'cgd_tax']
+
+  keys.forEach(key => {
+    let value = numberField.includes(key) ? Number(data[key]) : data[key]
+    formData.value[key] = value;
+  })
+
+  const { companyNo, supplierNo, khNo, cat} = formData.value;
+  categoryData.value = cat;
+  formData.value.cat = categoryData.value.map(({ id }) => id)
+
+  requsetRatelist();
+
+  //回显数据
+  companyRef.value.initalData({ companyNo })
+  supplierRef.value.initalData({ companyNo: supplierNo })
+  customerRef.value.initalData({ companyNo :khNo })
+}
+
+function onRequsetRateSuccess(data: Array<Record<string, string>>) {
+  const { tax } = formData.value;
+  if (!data || !tax) return null;
+  formData.value.tax = data.find(({ rate }) => rate === tax)?.id;
+}
+
+const { data:userlist, run: runUserlist, loading: userLoading } = useAsync<Array<Record<string,any>>>({
+  initalData: []
+})
+
+const { data: ratelist, run: runRatelist, loading: rateLoading } = useAsync<Array<Record<string, any>>>({
+  isList: false,
+  initalData: [],
+  success: (data) => onRequsetRateSuccess(data)
+})
+
+
+const { run: runCreate, loading: createLoading } = useAsync({
+  success:() => onSuccess()
+});
+
+const { run: runUpdate, loading: updateLoading } = useAsync({
+  success:() => onSuccess()
+});
+
+const { run: runDetail ,loading: detailLoading } = useAsync({
+  initalData: {},
+  success: (data) => onRequsetDetailSuccess(data)
+})
+
+const categoryData = ref<Array<Record<string,string>>>([])
+
+const title = computed(() => { 
+  const baseTitle = '确认单'
+  const isPreview = modalType.value === ModalTypes.preview;
+  const isCreate = modalType.value === ModalTypes.create;
+  if (isPreview) return `${baseTitle}详情`
+  return `${isCreate ? '创建' : '修改'}${baseTitle}`
+})
+
+const dialogloading = computed(() => userLoading.value || rateLoading.value || detailLoading.value)
+const actionLoading = computed(() => createLoading.value || updateLoading.value)
+
+const total = computed(() => { 
+  const { goodNum, goodPrice } = formData.value;
+  return (Number(goodNum) * Number(goodPrice)).toFixed(2)
+})
+
+const requsetUserlist = () => runUserlist(httpUserList())
+const requsetRatelist = () => runRatelist(httpRatelist());
+const requsetCreateQrd = (data) => runCreate(httpCreate(data))
+const requsetUpdateQrd = (data) => runUpdate(httpUpdate(data))
+const requsetQrdDetail = (data) => runDetail(httpDetail(data))
+
+const getUserName = (userid) => userlist.value.find(({ id }) => id === userid)?.nickname
+
+function handleConfirm() { 
+  const { sale_id, buyerid } = formData.value
+  if (sale_id === buyerid) { 
+    ElMessage.warning("采购员和销售员不能相同");
+    return
+  }
+
+  formRef.value.validate(isValid => { 
+    if (!isValid) return null
+    const isUpdate = modalType.value === ModalTypes.update;
+
+    const params = {
+      ...formData.value,
+      cat: categoryData.value,
+      sale_name: getUserName(sale_id),
+      buyer: getUserName(buyerid)
+    };
+
+    const requsetFunc = isUpdate ? requsetUpdateQrd : requsetCreateQrd;
+
+    requsetFunc(params);
+  }) 
+}
+
+function onDisplay(_modalType: ModalTypes, id?: string) {
+  const isUpdateOrPriview = _modalType === ModalTypes.update || _modalType === ModalTypes.preview;
+  visible.value = true;
+  modalType.value = _modalType;
+  isUpdateOrPriview && requsetQrdDetail({ id });
+  !isUpdateOrPriview && requsetRatelist();
+  requsetUserlist();
+ }
+
+defineExpose({ onDisplay })
+</script>
+
+<template>
+  <ElDialog 
+   v-model="visible" 
+   :title="title" 
+   width="1040px" 
+   center 
+   top="10vh" 
+   v-loading="dialogloading" 
+   @close="() => formData = {...defaultData}"
+   destroy-on-close
+ >
+     <ElForm
+        ref="formRef"
+        :model="formData"
+        :rules="formRules"
+        label-width="93px"
+        :disabled="modalType === ModalTypes.preview"
+      >
+        <ElRow :gutter="10">
+          <ElCol :span="24" style="padding: 0 0 10px 0; margin-top: -5px">
+            <ElDivider><ElTag>确认单信息</ElTag></ElDivider>
+          </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="销售员" prop="sale_id">
+              <ElSelect v-model="formData.sale_id" placeholder="请选择销售员" style="width: 100%;">
+                <ElOption
+                   v-for="user in userlist"
+                   :key="user.id"
+                   :value="user.id"
+                   :label="user.nickname"
+                  />
+                </ElSelect>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="销售员部门" prop="sale_depart">
+              <ElSelect style="width:100%" v-model="formData.sale_depart">
+                <ElOption 
+                  v-for="(deparment,index) in saleDepartOptions" 
+                  :label="deparment.value" 
+                  :value="deparment.value"
+                  :disabled="deparment.status !== '1'"
+                  :key="index" 
+                />
+              </ElSelect>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="确认单类型" prop="qrdType">
+              <ElSelect style="width:100%" v-model="formData.qrdType" disabled>
+                <ElOption 
+                   v-for="qrdType in qrdTypeOptions" 
+                   :key="qrdType.value" 
+                   :label="qrdType.label" 
+                   :value="qrdType.value" 
+                  />
+              </ElSelect> 
+            </ElFormItem>
+            </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="采购员" prop="buyerid">
+              <ElSelect placeholder="请选择用户" style="width: 100%;" v-model="formData.buyerid">
+                <ElOption
+                   v-for="user in userlist"
+                   :key="user.id"
+                   :value="user.id"
+                   :label="user.nickname"
+                  />
+                </ElSelect>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="采购员部门" prop="cgd_depart">
+              <ElSelect style="width:100%" v-model="formData.cgd_depart">
+                <ElOption 
+                  v-for="(deparment,index) in purchaseDepartOptions" 
+                  :label="deparment.value" 
+                  :value="deparment.value"
+                  :disabled="deparment.status !== '1'"
+                  :key="index" 
+                  />
+              </ElSelect>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="8">
+            <ElFormItem label="采购毛利率" prop="cgd_tax">
+              <ElInputNumber
+                v-model="formData.cgd_tax"
+                style="width: 100%"
+                controls-position="right"
+                placeholder="采购毛利率"
+                step-strictly
+                :min="0"
+                :precision="2"
+                :step="1"
+                :max="100"
+              ></ElInputNumber>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="单据号" prop="workCode">
+              <ElInput
+                v-model="formData.workCode"
+                placeholder="单据号"
+                maxlength="200"
+              />
+            </ElFormItem> </ElCol> 
+            
+            <ElCol :span="12">
+            <ElFormItem label="PO编号" prop="poCode">
+              <ElInput
+                v-model="formData.poCode"
+                placeholder="PO编号"
+                maxlength="200"
+              />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="购买方公司" prop="khNo">
+              <Customer ref="customerRef" v-model="formData.khNo"  />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="销售方公司" prop="companyNo">
+              <Company ref="companyRef" v-model="formData.companyNo" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="24" style="padding: 0 0 10px 0; margin-top: -5px">
+            <ElDivider><ElTag>收货信息</ElTag></ElDivider>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="收货人" prop="contactor">
+              <ElInput
+                v-model="formData.contactor"
+                placeholder="收货人"
+                maxlength="200"
+              />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="联系电话" prop="mobile">
+              <ElInput
+                v-model="formData.mobile"
+                placeholder="联系电话"
+                maxlength="200"
+              />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="联系地址" prop="addr">
+              <ElInput
+                v-model="formData.addr"
+                placeholder="联系地址"
+                maxlength="200"
+              />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="发货时间" prop="sendtime">
+              <ElDatePicker
+                 v-model="formData.sendtime"
+                :disabled-date="disabledDate"
+                :editable="false"
+                :clearable="true"
+                placeholder="发货时间"
+                style="width: 100%; margin: 0"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+              >
+              </ElDatePicker>
+            </ElFormItem>
+          </ElCol>
+          
+          <ElCol :span="24" style="padding: 0 0 10px 0; margin-top: -5px">
+            <ElDivider><ElTag>商品信息</ElTag></ElDivider>
+          </ElCol>
+
+          <ElCol :span="12">
+            <ElFormItem label="供应商公司" prop="supplierNo">
+              <Supplier ref="supplierRef" v-model="formData.supplierNo" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="商品分类" prop="cat">
+              <Category v-model="formData.cat"  @change="categorys => categoryData = categorys" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12">
+            <ElFormItem label="商品名称" prop="goodName">
+              <ElInput
+                v-model="formData.goodName"
+                placeholder="商品名称"
+                maxlength="200"
+              /> 
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="6">
+            <ElFormItem label="数量" prop="goodNum">
+              <ElInputNumber
+                v-model="formData.goodNum"
+                style="width: 100%"
+                controls-position="right"
+                placeholder="数量"
+                :min="0"
+                :precision="0"
+                step-strictly
+                :step="1"
+                :max="9999999"
+              ></ElInputNumber> </ElFormItem
+          ></ElCol>
+          <ElCol :span="6">
+            <ElFormItem label="单价" label-width="55px" prop="goodPrice">
+              <ElInputNumber
+                 v-model="formData.goodPrice"
+                controls-position="right"
+                placeholder="单价"
+                style="width: 100%"
+                :min="0"
+                :precision="2"
+                step-strictly
+                :step="1"
+                :max="9999999"
+              ></ElInputNumber>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="6">
+            <ElFormItem label="货款总额">
+               <ElInput
+                  :value="total"
+                  placeholder="货款总额"
+                  disabled
+                >
+                  <template #append>元</template>
+                </ElInput>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="6">
+            <ElFormItem label="税率" prop="tax">
+              <ElSelect style="width:100%" v-model="formData.tax">
+                <ElOption 
+                  v-for="rate in ratelist"
+                  :key="rate.id"
+                  :label="rate.rate + '%'"
+                  :value="rate.id"
+                />
+              </ElSelect>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :span="12" style="text-align: right; padding: 5px 0 0 0">
+            <ElButton type="primary" @click="handleConfirm" :loading="actionLoading">保存</ElButton>
+            <ElButton @click="() => visible = false">关闭</ElButton>
+          </ElCol>
+        </ElRow>
+      </ElForm>
+  </ElDialog>
+</template>

+ 0 - 15
src/views/purchase/porder/config/_options.ts

@@ -65,21 +65,6 @@ export const cgdStatusOptions = [
   }
 ];
 
-export const cgdTypeOptions = [
-  {
-    value: "1",
-    label: "库存"
-  },
-  {
-    value: "2",
-    label: "非库存"
-  },
-  {
-    value: "3",
-    label: "咨询"
-  }
-];
-
 export const goodTypeOptions = [
   {
     value: "1",

+ 2 - 2
src/views/purchase/porder/config/content.config.ts

@@ -4,11 +4,11 @@ import { renderProp } from "/@/utils/columnRenderHelper";
 
 import {
   cgdStatusOptions,
-  cgdTypeOptions,
   sendStatusOptions
 } from "./_options";
 
 import { CG_ORDER_SOURCE_OPTIONS } from "/@/config/status";
+import { cg_order_type_options } from "/@/utils/status";
 
 const columns = [
   // {
@@ -50,7 +50,7 @@ const columns = [
     label: "商品来源",
     prop: "cgdType",
     width: 95,
-    ...renderProp(cgdTypeOptions, "cgdType")
+    ...renderProp(cg_order_type_options, "cgdType")
   },
   {
     label: "商品编号",

+ 0 - 15
src/views/supply/porder/config/_options.ts

@@ -65,21 +65,6 @@ export const cgdStatusOptions = [
   }
 ];
 
-export const cgdTypeOptions = [
-  {
-    value: "1",
-    label: "库存"
-  },
-  {
-    value: "2",
-    label: "非库存"
-  },
-  {
-    value: "3",
-    label: "咨询"
-  }
-];
-
 export const goodTypeOptions = [
   {
     value: "1",

+ 2 - 2
src/views/supply/porder/config/content.config.ts

@@ -4,11 +4,11 @@ import { renderProp } from "/@/utils/columnRenderHelper";
 
 import {
   cgdStatusOptions,
-  cgdTypeOptions,
   sendStatusOptions
 } from "./_options";
 
 import { CG_ORDER_SOURCE_OPTIONS } from "/@/config/status";
+import { cg_order_type_options } from "/@/utils/status";
 
 const columns = [
   {
@@ -50,7 +50,7 @@ const columns = [
     label: "商品来源",
     prop: "cgdType",
     width: 95,
-    ...renderProp(cgdTypeOptions, "cgdType")
+    ...renderProp(cg_order_type_options, "cgdType")
   },
   {
     label: "商品编号",

+ 6 - 9
src/views/system/menuOperator/components/edit-dialog.vue

@@ -32,7 +32,7 @@ const initform = {
   menu_url: "",
   private: "1",
   weight: "1",
-  pid: "",
+  pid: "0",
   level: "",
   id: ""
 };
@@ -154,12 +154,10 @@ function handleCreate() {
 }
 
 function handleSave() {
-  formRef.value.validate(async vaild => {
-    if (vaild) {
+  formRef.value.validate(async valid => {
+    if (valid) {
       if (loading.value) return;
-      const handler =
-        TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
-
+      const handler = TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
       loading.value = true;
       const { api, data } = handler();
       const { message, code } = await api(data);
@@ -205,7 +203,6 @@ defineExpose({
         :model="ruleForm"
         :rules="rules"
         label-width="90px"
-        style="margin-top: -10px"
         class="demo-ruleForm"
         status-icon
       >
@@ -265,7 +262,7 @@ defineExpose({
             </el-form-item></el-col
           >
 
-          <el-col :span="24" v-show="ruleForm.menu_type === '2'">
+          <el-col :span="24" v-if="ruleForm.menu_type === '2'">
             <el-form-item label="页面地址" prop="menu_url">
               <el-input
                 v-model="ruleForm.menu_url"
@@ -290,7 +287,7 @@ defineExpose({
               /> </el-form-item
           ></el-col>
 
-          <el-col :span="12" v-show="ruleForm.menu_type === '2'">
+          <el-col :span="12">
             <el-form-item label-width="120px" label="菜单权限等级" prop="level">
               <el-select v-model="ruleForm.level">
                 <el-option label="超管" value="1" />