xiaodai2017 2 gadi atpakaļ
vecāks
revīzija
36189ae76a
30 mainītis faili ar 756 papildinājumiem un 1079 dzēšanām
  1. 1 1
      src/components/PageContent/src/actions/action-log.tsx
  2. 2 2
      src/components/PageContent/src/page-content.tsx
  3. 2 3
      src/components/PageContent/src/types.ts
  4. 6 6
      src/layout/components/navbar.vue
  5. 6 6
      src/layout/components/sidebar/horizontal.vue
  6. 6 6
      src/layout/components/sidebar/mixNav.vue
  7. 58 23
      src/views/mobile/exchangeStock/components/add-dialog.vue
  8. 28 3
      src/views/mobile/exchangeStock/components/edit-dialog.vue
  9. 1 1
      src/views/mobile/exchangeStock/components/ladder-table.vue
  10. 0 119
      src/views/mobile/exchangeStock/config/_details.ts
  11. 0 33
      src/views/mobile/exchangeStock/config/_rules.ts
  12. 6 28
      src/views/mobile/exchangeStock/config/content.config.ts
  13. 0 64
      src/views/mobile/exchangeStock/config/modal.config.ts
  14. 9 9
      src/views/mobile/exchangeStock/config/search.config.ts
  15. 0 31
      src/views/mobile/exchangeStock/config/search.config1.ts
  16. 17 127
      src/views/mobile/exchangeStock/index.vue
  17. 206 0
      src/views/mobile/shopStock/components/add-dialog.vue
  18. 219 0
      src/views/mobile/shopStock/components/edit-dialog.vue
  19. 1 1
      src/views/mobile/shopStock/components/ladder-table.vue
  20. 13 2
      src/views/mobile/shopStock/config/ListModal.config.ts
  21. 0 100
      src/views/mobile/shopStock/config/_details.ts
  22. 0 33
      src/views/mobile/shopStock/config/_rules.ts
  23. 3 24
      src/views/mobile/shopStock/config/content.config.ts
  24. 0 64
      src/views/mobile/shopStock/config/modal.config.ts
  25. 9 9
      src/views/mobile/shopStock/config/search.config.ts
  26. 0 31
      src/views/mobile/shopStock/config/search.config1.ts
  27. 0 176
      src/views/mobile/shopStock/cpns/addModel.vue
  28. 0 11
      src/views/mobile/shopStock/cpns/utils/create-basic-title.ts
  29. 0 27
      src/views/mobile/shopStock/cpns/utils/types.ts
  30. 163 139
      src/views/mobile/shopStock/index.vue

+ 1 - 1
src/components/PageContent/src/actions/action-log.tsx

@@ -8,10 +8,10 @@ const ActionLog = defineComponent({
     return () => (
       <el-button
         class="reset-margin"
-        onClick={() => emit("log")}
         link
         size="small"
         type="primary"
+        onClick={() => emit("log")}
         icon={useRenderIcon("tickets")}
       />
     );

+ 2 - 2
src/components/PageContent/src/page-content.tsx

@@ -32,7 +32,7 @@ const PageConent = defineComponent({
   setup(props, { expose, emit, slots }) {
     //根据传入的api决定表格需要的操作
     const action = createOperation(props.contentConfig.apis);
-    // console.log(action);
+    console.log(action);
 
     const tableRef = ref<InstanceType<typeof PureTable>>(null);
 
@@ -130,7 +130,7 @@ const PageConent = defineComponent({
             />
           )}
           {powers.some(i => i == "022") && (
-            <Operation.Log onLog={() => emit("logBtnClick", row)} />
+            <Operation.Log isInv={inv} onLog={() => emit("logBtnClick", row)} />
           )}
         </>
       );

+ 2 - 3
src/components/PageContent/src/types.ts

@@ -56,13 +56,12 @@ export type ActionType =
   | "status"
   | "resetPwd"
   | "changePwd"
-  | "export";
+  | "export"
+  | "log";
 
 export interface ContentApis {
-  httpAdd?: API;
   httpList: API;
   httpDelete?: API;
-  httpUpdate?: API;
   httpStatus?: API;
   httpResetPwd?: API;
   httpChangePwd?: API;

+ 6 - 6
src/layout/components/navbar.vue

@@ -45,11 +45,11 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
 
     <div v-if="layout === 'vertical'" class="vertical-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
-      <Notice id="header-notice" />
+      <!-- <Notice id="header-notice" /> -->
       <!-- 国际化 -->
-      <el-dropdown id="header-translation" trigger="click">
+      <!-- <el-dropdown id="header-translation" trigger="click">
         <globalization
           class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
         />
@@ -79,7 +79,7 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
-      </el-dropdown>
+      </el-dropdown> -->
       <!-- 退出登录 -->
       <el-dropdown trigger="click">
         <span class="el-dropdown-link navbar-bg-hover">
@@ -98,13 +98,13 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span
+      <!-- <span
         class="set-icon navbar-bg-hover"
         :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

+ 6 - 6
src/layout/components/sidebar/horizontal.vue

@@ -57,11 +57,11 @@ watch(
     </el-menu>
     <div class="horizontal-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
-      <Notice id="header-notice" />
+      <!-- <Notice id="header-notice" /> -->
       <!-- 国际化 -->
-      <el-dropdown id="header-translation" trigger="click">
+      <!-- <el-dropdown id="header-translation" trigger="click">
         <globalization
           class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
         />
@@ -89,7 +89,7 @@ watch(
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
-      </el-dropdown>
+      </el-dropdown> -->
       <!-- 退出登录 -->
       <el-dropdown trigger="click">
         <span class="el-dropdown-link navbar-bg-hover">
@@ -108,13 +108,13 @@ watch(
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span
+      <!-- <span
         class="set-icon navbar-bg-hover"
         :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

+ 6 - 6
src/layout/components/sidebar/mixNav.vue

@@ -89,11 +89,11 @@ watch(
     </el-menu>
     <div class="horizontal-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
-      <Notice id="header-notice" />
+      <!-- <Notice id="header-notice" /> -->
       <!-- 国际化 -->
-      <el-dropdown id="header-translation" trigger="click">
+      <!-- <el-dropdown id="header-translation" trigger="click">
         <globalization
           class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
         />
@@ -121,7 +121,7 @@ watch(
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
-      </el-dropdown>
+      </el-dropdown> -->
       <!-- 退出登录 -->
       <el-dropdown trigger="click">
         <span class="el-dropdown-link navbar-bg-hover">
@@ -140,13 +140,13 @@ watch(
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span
+      <!-- <span
         class="set-icon navbar-bg-hover"
         :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

+ 58 - 23
src/views/mobile/exchangeStock/components/add-dialog.vue

@@ -1,13 +1,13 @@
 <script setup lang="ts">
 import { FormRules, ElForm, ElMessage } from "element-plus";
 import { reactive, ref } from "vue";
-import { httpUpdate, httpDetail } from "/@/api/mobile/exchangeStock";
+import { httpAdd, httpUpdate, httpDetail } from "/@/api/mobile/exchangeStock";
 import { responseHandle } from "/@/utils/responseHandle";
 import { useNav } from "/@/layout/hooks/useNav";
-import { FLAG_OPTIONS } from "/@/config/status";
+import { ComCard } from "/@/components/RemoteSelect";
 import OrderDialog from "/@/components/PageListModal";
-import LadderTable from "./components/ladder-table.vue";
-import LadderModal from "./components/ladder-modal.vue";
+import LadderTable from "./ladder-table.vue";
+// import LadderModal from "./ladder-modal.vue";
 enum FROM_TYPE {
   create = "create",
   edit = "edit",
@@ -16,7 +16,7 @@ enum FROM_TYPE {
 const { logout } = useNav();
 const showModel = ref(false);
 const TYPE = ref<FROM_TYPE>(FROM_TYPE.create);
-const ladderModalRef = ref<InstanceType<typeof LadderModal>>(null);
+// const ladderModalRef = ref<InstanceType<typeof LadderModal>>(null);
 
 const formRef = ref<InstanceType<typeof ElForm>>(null);
 const modelOrderRef = ref<InstanceType<typeof OrderDialog>>(null);
@@ -58,9 +58,26 @@ const initData = async () => {
   });
 };
 function modularShow() {
-  if (!ruleForm.value.group_id) return ElMessage.warning("请选择公司卡类型!");
+  console.log(ruleForm.value);
+  if (!ruleForm.value.group_id) {
+    ElMessage.warning("请选择公司卡类型!");
+    return;
+  }
   modelOrderRef.value.show(ruleForm.value.group_id, "1");
 }
+function handleAddOrder(list) {
+  console.log(list);
+  list.forEach(item => {
+    const { id } = item;
+    let findex = ruleForm.value.list.findIndex(e => e.id + "" == id + "");
+    if (findex == -1) {
+      let model = Object.assign(item, {
+        inventory: 100
+      });
+      ruleForm.value.list.push(model);
+    }
+  });
+}
 async function show(node: any, did: string, isCreate: string) {
   id.value = did;
   loading.value = true;
@@ -98,15 +115,43 @@ function handleUpdate() {
     api: httpUpdate
   };
 }
+function handleCreate() {
+  const data = {
+    ...ruleForm.value
+  };
+
+  return {
+    data,
+    api: httpAdd
+  };
+}
 
 function handleSave() {
   formRef.value.validate(async vaild => {
     if (vaild) {
       if (loading.value) return;
       loading.value = true;
-      const handler = handleUpdate;
+      const handler =
+        TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
       const { api, data } = handler();
-      const { message, code } = await api(data);
+      const { group_id, list } = data;
+      const model = {
+        group_id,
+        list: []
+      };
+      let isok = true;
+      list.forEach(si => {
+        if (Number.isNaN(si.inventory) || Number(si.inventory) === 0) {
+          isok = false;
+        }
+        model.list.push({ good_id: si.id, inventory: si.inventory });
+      });
+      if (!isok) {
+        ElMessage.warning("部分商品添加库存数为0!");
+        loading.value = false;
+        return;
+      }
+      const { message, code } = await api(model);
       loading.value = false;
       responseHandle({
         code,
@@ -148,19 +193,12 @@ defineExpose({
       <el-row>
         <el-col :span="24">
           <el-form-item label="公司卡类型" prop="group_id">
-            <el-select
+            <ComCard
               v-model="ruleForm.group_id"
-              placeholder="变动状态"
               :disabled="TYPE === 'view'"
-              style="width: 100%"
-            >
-              <el-option
-                v-for="(item, index) in FLAG_OPTIONS"
-                :label="item.label"
-                :value="item.id"
-                :key="item.id + index"
-              />
-            </el-select>
+              placeholder="公司卡类型"
+              @change="ruleForm.list = []"
+            />
           </el-form-item>
         </el-col>
         <el-col :span="24">
@@ -169,15 +207,12 @@ defineExpose({
               :readonly="false"
               :ladder="ruleForm.list"
               @choose="() => modularShow()"
-              @update="
-                ({ data, index }) => ladderModalRef.onDisplay(data, index)
-              "
               @delete="index => ruleForm.list.splice(index, 1)"
             />
           </el-form-item>
         </el-col>
 
-        <el-col :span="8" class="flex justify-end">
+        <el-col :span="24" class="flex justify-end">
           <el-button
             v-if="TYPE !== 'view'"
             :loading="loading"

+ 28 - 3
src/views/mobile/exchangeStock/components/edit-dialog.vue

@@ -22,6 +22,7 @@ const emit = defineEmits(["reload"]);
 const initform = {
   id: "",
   number: 1,
+  inventory: 0,
   flag: "1"
 };
 const ruleForm = ref({ ...initform });
@@ -143,7 +144,23 @@ defineExpose({
       status-icon
     >
       <el-row>
-        <el-col :span="8">
+        <el-col :span="6">
+          <el-form-item label="当前库存数" prop="inventory">
+            <el-input-number
+              v-model="ruleForm.inventory"
+              :step="1"
+              :min="0"
+              :disabled="true"
+              :precision="0"
+              style="width: 100%"
+              :max="99999999"
+              value-on-clear="min"
+              controls-position="right"
+              step-strictly
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6" v-if="TYPE !== 'view'">
           <el-form-item label="变动状态" prop="flag">
             <el-select
               v-model="ruleForm.flag"
@@ -160,7 +177,8 @@ defineExpose({
             </el-select>
           </el-form-item>
         </el-col>
-        <el-col :span="8">
+
+        <el-col :span="6" v-if="TYPE !== 'view'">
           <el-form-item label="变动数量" prop="number">
             <el-input-number
               v-model="ruleForm.number"
@@ -177,7 +195,7 @@ defineExpose({
           </el-form-item>
         </el-col>
 
-        <el-col :span="8" class="flex justify-end">
+        <el-col :span="TYPE !== 'view' ? 6 : 18" class="flex justify-end">
           <el-button
             v-if="TYPE !== 'view'"
             :loading="loading"
@@ -188,6 +206,13 @@ defineExpose({
           >
           <el-button @click="showModel = false">取消</el-button>
         </el-col>
+        <el-col :span="24">
+          <el-form-item label="账号信息"> 111 </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="商品信息"> 22 </el-form-item>
+        </el-col>
       </el-row>
     </el-form>
   </el-dialog>

+ 1 - 1
src/views/mobile/exchangeStock/components/ladder-table.vue

@@ -33,7 +33,7 @@ defineProps<{
           :preview-src-list="
             row.good_cover_img !== '' ? [row.good_cover_img] : []
           "
-          z-index="99999"
+          :z-index="99999"
           preview-teleported
         />
       </template>

+ 0 - 119
src/views/mobile/exchangeStock/config/_details.ts

@@ -1,119 +0,0 @@
-/* eslint-disable prettier/prettier */
-
-import { DescriptionColumns } from "/@/components/BasicDescriptions";
-import { FormConfig } from "/@/components/PageSearch";
-import {
-  // renderStatus,
-  renderImage,
-  renderImages,
-  renderGoodParam
-} from "/@/utils/column-helper";
-
-export const projectFormConfig: FormConfig = {
-  labelWidth: "100px",
-  formItems: [
-    {
-      label: "公司卡类型",
-      field: "group_id",
-      placeholder: "公司卡类型",
-      span: 24,
-      slot: "group_id"
-    },
-    {
-      label: "商品信息",
-      field: "list",
-      type: "array",
-      placeholder: "商品信息",
-      span: 24,
-      slot: "list"
-    }
-  ]
-};
-
-export const bargainColumns: DescriptionColumns = [
-
-
-  
-  {
-    field: "account_username",
-    label: "账户",
-    span: 8
-  },
-
-  {
-    field: "account_name",
-    label: "账户姓名",
-    span: 8
-  },
-  {
-    field: "good_code",
-    label: "商品编码",
-    span: 8
-  },
-
-  {
-    field: "good_cover_img",
-    label: "封面图",
-    span: 4,
-    render: (_, row) => renderImage("good_cover_img").cellRenderer({ row })
-  },
-  {
-    field: "good_name",
-    label: "商品名称",
-    span: 20
-  },
-  {
-    field: "unit",
-    label: "单位",
-    span: 8
-  },
-  {
-    field: "moq",
-    label: "起订量",
-    span: 8
-  },
-  {
-    field: "step",
-    label: "步长",
-    span: 8
-  },
-  {
-    field: "price",
-    label: "售价",
-    span: 8
-  },
-  {
-    field: "inventory",
-    label: "当前库存数",
-    span: 8
-  },
-  {
-    field: "updatetime",
-    label: "更新时间",
-    span: 8
-  },
-
-  {
-    field: "good_banner_img",
-    label: "商品轮播图",
-    span: 12,
-    render: (_, row) => renderImages("good_banner_img").cellRenderer({ row })
-  },
-  {
-    field: "good_img",
-    label: "商品详情图",
-    render: (_, row) => renderImages("good_img").cellRenderer({ row }),
-    span: 12
-  },
-  {
-    field: "good_param",
-    label: "商品参数",
-    render: (_, row) => renderGoodParam("good_param").cellRenderer({ row }),
-    span: 24
-  },
-  {
-    field: "good_remark",
-    label: "商品备注",
-    span: 24
-  }
-];

+ 0 - 33
src/views/mobile/exchangeStock/config/_rules.ts

@@ -1,33 +0,0 @@
-import { FormRules } from "element-plus";
-
-export const ladderFormRules: FormRules = {
-  key: {
-    trigger: "change",
-    required: true,
-    message: "请选择商品类型"
-  },
-  value: {
-    trigger: "change",
-    required: true,
-    message: "请选择单位"
-  }
-};
-
-export const projectFormRules: FormRules = {
-  number: {
-    trigger: "change",
-    required: true,
-    validator(_, value) {
-      if (value === "") return new Error("请输入库存变动数");
-      return true;
-    }
-  },
-  flag: {
-    trigger: "change",
-    required: true,
-    validator(_, value) {
-      if (value.length === 0) return new Error("请选择修改状态!");
-      return true;
-    }
-  }
-};

+ 6 - 28
src/views/mobile/exchangeStock/config/content.config.ts

@@ -1,31 +1,14 @@
-import { isString } from "@pureadmin/utils";
-import { h } from "vue";
 import { ContentConfig } from "/@/components/PageContent";
-import {
-  // httpDelete,
-  // httpStatus,
-  httpList,
-  httpAdd,
-  httpLog,
-  httpUpdate
-} from "/@/api/mobile/exchangeStock";
-import { STATUS_OPTIONS } from "/@/config/status";
-import { ElTag } from "element-plus";
+import { httpList } from "/@/api/mobile/exchangeStock";
 import { renderImage } from "/@/utils/column-helper";
 const columns = [
-  {
-    type: "selection",
-    width: 55,
-    hide: ({ checkList }) => !checkList.includes("勾选列")
-  },
-  // {
-  //   prop: "id",
-  //   label: "ID"
-  // },
+ 
+ 
 
   {
     prop: "account_username",
-    label: "账户"
+    label: "账户",
+    width: 120
   },
   {
     prop: "account_name",
@@ -95,12 +78,7 @@ const contentConfig: ContentConfig = {
   title: "卡类型管理",
   columns,
   apis: {
-    httpAdd,
-    // httpDelete,
-    // httpStatus,
-    httpList,
-    httpLog,
-    httpUpdate
+    httpList
   }
 };
 

+ 0 - 64
src/views/mobile/exchangeStock/config/modal.config.ts

@@ -1,64 +0,0 @@
-import { ModalConfig } from "/@/components/PageModal/src/types";
-import { isLicense } from "/@/utils/validate";
-
-const modalConfig: ModalConfig = {
-  title: "视频",
-  colLayout: { span: 24 },
-  itemStyle: {},
-  contact: "invoice_mobile",
-  formItems: [
-    {
-      field: "video_sn",
-      type: "input",
-      label: "视频编号",
-      isHidden: true,
-      labelWidth: "120px",
-      placeholder: "视频编号"
-    },
-
-    {
-      field: "nickname",
-      type: "input",
-      label: "视频名称",
-      labelWidth: "120px",
-      placeholder: "视频名称",
-      rules: [{ required: true, trigger: "change", message: "请输入视频名称" }]
-    },
-    {
-      field: "mobile",
-      type: "input",
-      label: "视频链接",
-      labelWidth: "120px",
-      placeholder: "视频链接",
-      rules: [{ required: true, trigger: "change", message: "请输入视频链接" }]
-    },
-    {
-      field: "remark",
-      type: "input",
-      label: "视频描述",
-      labelWidth: "120px",
-      placeholder: "视频描述",
-      rules: [{ required: true, trigger: "change", message: "请输入视频描述" }]
-    },
-    {
-      field: "video_img",
-      type: "img_upload",
-      label: "视频封面",
-      labelWidth: "120px",
-      placeholder: "视频封面",
-      rules: [
-        { required: true, trigger: "change", message: "请上传视频封面!" }
-      ]
-    },
-    {
-      field: "video_set",
-      type: "input",
-      label: "视频设置",
-      labelWidth: "120px",
-      isHidden: true,
-      placeholder: "视频设置"
-    }
-  ]
-};
-
-export default modalConfig;

+ 9 - 9
src/views/mobile/exchangeStock/config/search.config.ts

@@ -1,5 +1,5 @@
 import { FormConfig } from "/@/components/PageSearch";
-import { STATUS_OPTIONS } from "/@/config/status";
+import { ACCOUNT_STATUS_OPTIONS } from "/@/config/status";
 import { convertOptions } from "/@/utils/column-helper";
 
 const searchFormConfig: FormConfig = {
@@ -7,23 +7,23 @@ const searchFormConfig: FormConfig = {
     {
       field: "status",
       type: "select",
-      placeholder: "视频状态",
-      options: convertOptions(STATUS_OPTIONS)
+      placeholder: "账号状态",
+      options: convertOptions(ACCOUNT_STATUS_OPTIONS)
     },
     {
-      field: "video_name",
+      field: "username",
       type: "input",
-      placeholder: "视频名称"
+      placeholder: "账号"
     },
     {
-      field: "video_url",
+      field: "nickname",
       type: "input",
-      placeholder: "视频地址"
+      placeholder: "客户姓名"
     },
     {
-      field: "video_sn",
+      field: "mobile",
       type: "input",
-      placeholder: "视频编号"
+      placeholder: "客户手机号"
     }
   ]
 };

+ 0 - 31
src/views/mobile/exchangeStock/config/search.config1.ts

@@ -1,31 +0,0 @@
-import { FormConfig } from "/@/components/PageSearch";
-import { STATUS_OPTIONS } from "/@/config/status";
-import { convertOptions } from "/@/utils/column-helper";
-
-const searchFormConfig: FormConfig = {
-  formItems: [
-    {
-      field: "status",
-      type: "select",
-      placeholder: "视频状态",
-      options: convertOptions(STATUS_OPTIONS)
-    },
-    {
-      field: "video_name",
-      type: "input",
-      placeholder: "视频名称"
-    },
-    {
-      field: "video_url",
-      type: "input",
-      placeholder: "视频地址"
-    },
-    {
-      field: "video_sn",
-      type: "input",
-      placeholder: "视频编号"
-    }
-  ]
-};
-
-export default searchFormConfig;

+ 17 - 127
src/views/mobile/exchangeStock/index.vue

@@ -1,113 +1,37 @@
 <script setup lang="ts">
 import { ref } from "vue";
 import { usePermission } from "/@/hooks/usePermission";
-import EditModel from "./components/edit-dialog.vue";
 import { PageSearch, usePageSearch } from "/@/components/PageSearch";
+import { PageContent } from "/@/components/PageContent";
 import searchConfig from "./config/search.config";
 import contentConfig from "./config/content.config";
-
-import { PageModal, usePageModal } from "/@/components/PageModalShell";
-import modalConfig from "./config/modal.config";
-import { PageContent } from "/@/components/PageContent";
-import { projectFormConfig } from "./config/_details";
-import { projectFormRules } from "./config/_rules";
+import EditModel from "./components/edit-dialog.vue";
+import AddModel from "./components/add-dialog.vue";
 import ListModalConfig from "./config/ListModal.config";
-
-import {
-  BasicForm,
-  transform,
-  createDefaultData
-} from "/@/components/BasicForm";
-
-import addModel from "./components/addModel.vue";
-import { useResponseHandle } from "/@/hooks/useAsync";
-import LadderTable from "./components/ladder-table.vue";
-import { ComCard } from "/@/components/RemoteSelect";
-import OrderDialog from "/@/components/PageListModal";
-import { ElForm, ElMessage } from "element-plus";
 import ListModal from "/@/components/ListModal";
 const pageName = "exchangeStock";
 const { hasPermissionWithCode, permissions } = usePermission(pageName);
-const modelRef = ref<InstanceType<typeof EditModel>>(null);
-const responseHandle = useResponseHandle();
-const modelOrderRef = ref<InstanceType<typeof OrderDialog>>(null);
-const actionModalRef = ref<InstanceType<typeof addModel>>(null);
+const modelEditRef = ref<InstanceType<typeof EditModel>>(null);
+const modelAddRef = ref<InstanceType<typeof AddModel>>(null);
+
 const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch(
   undefined,
   undefined,
   searchConfig
 );
-const { pageModalRef, handleCreateData, handleConfrim, defaultInfo } =
-  usePageModal({
-    pageContentRef
-  });
+
 const ListModalRef = ref<InstanceType<typeof ListModal>>(null);
-const { formItems } = projectFormConfig;
-const basicFormRef = ref<InstanceType<typeof ElForm>>(null);
-const formData = ref<Record<string, any>>(createDefaultData(formItems));
-function handleCreate() {
-  basicFormRef.value.validate(isValid => {
-    if (!isValid) return;
-    const { group_id, list } = formData.value;
-    const params = {
-      group_id,
-      list: []
-    };
-    let isok = true;
-    list.forEach(item => {
-      const num = Number(item.inventory ?? "");
-      const model = {
-        good_id: item.id,
-        inventory: num
-      };
-      params.list.push(model);
-      if (num === 0) {
-        isok = false;
-      }
-    });
-    if (!isok) {
-      ElMessage.warning("库存数不能为空!");
-      return;
-    }
 
-    handleConfrim("create", params);
-    // emit("create", params);
-  });
-}
-function Create() {
-  pageContentRef.value.getPageData({ id: "" });
-}
-async function handleDetailData(id, type) {
-  actionModalRef.value.onShow("兑换商品库存", type, id);
-}
-function modularShow() {
-  if (!formData.value.group_id) return ElMessage.warning("请选择公司卡类型!");
-  modelOrderRef.value.show(formData.value.group_id, "1");
-}
-function handleAddOrder(list) {
-  console.log(list);
-  list.forEach(item => {
-    const { id } = item;
-    let findex = formData.value.list.findIndex(e => e.id + "" == id + "");
-    if (findex == -1) {
-      let model = Object.assign(item, {
-        img: item.good_cover_img,
-        good_id: item.id,
-        jump_type: "2",
-        jump_param: `/good?id=${item.id}`,
-        style_type: "",
-        title: ""
-      });
-      formData.value.list.push(model);
-    }
-  });
-}
-function aa(id) {
+function showLog(id) {
   console.log(id);
   ListModalRef.value.show(id);
 }
 function handleAddChangeCheck(item: any, id: string, type: string) {
-  modelRef.value.show(item, id, type);
+  if (type === "create") {
+    modelAddRef.value.show(item, id, type);
+  } else {
+    modelEditRef.value.show(item, id, type);
+  }
 }
 </script>
 
@@ -134,46 +58,12 @@ function handleAddChangeCheck(item: any, id: string, type: string) {
       :content-config="contentConfig"
       @preview-btn-click="row => handleAddChangeCheck(row, row.id, 'view')"
       @update-btn-click="row => handleAddChangeCheck(row, row.id, 'edit')"
-      @log-btn-click="({ id }) => aa(id)"
+      @log-btn-click="({ id }) => showLog(id)"
     />
 
-    <PageModal
-      ref="pageModalRef"
-      :modal-config="modalConfig"
-      :default-info="defaultInfo"
-      @confirm-btn-click="handleConfrim"
-    >
-      <BasicForm
-        ref="basicFormRef"
-        v-bind="projectFormConfig"
-        :form-data="formData"
-        :rules="projectFormRules"
-        :disabled="false"
-        label-width="120px"
-      >
-        <template #group_id>
-          <ComCard v-model="formData.group_id" placeholder="公司卡类型" />
-        </template>
-        <!-- //ladderModalRef.onDisplay(data, -->
-        <!-- index)"  =>formData.list.splice(index, 1)" -->
-        <template #list>
-          <LadderTable
-            :readonly="false"
-            :ladder="formData.list"
-            @choose="() => modularShow()"
-            @update="({ data, index }) => formData.list.splice(index, 1)"
-            @delete="index => formData.list.splice(index, 1)"
-          />
-        </template>
-        <template #footer>
-          <div class="w-full flex justify-end">
-            <ElButton type="primary" @click="handleCreate">保存</ElButton>
-          </div>
-        </template>
-      </BasicForm>
-    </PageModal>
-    <EditModel ref="modelRef" @reload="pageContentRef.onSearch()" />
-    <OrderDialog ref="modelOrderRef" @save-btn-click="handleAddOrder" />
+    <AddModel ref="modelAddRef" @reload="pageContentRef.onSearch()" />
+    <EditModel ref="modelEditRef" @reload="pageContentRef.onSearch()" />
+    <!-- <OrderDialog ref="modelOrderRef" @save-btn-click="handleAddOrder" /> -->
     <!-- <addModel ref="actionModalRef" @submitOk="Create" /> -->
     <ListModal ref="ListModalRef" :modalConfig="ListModalConfig" />
   </PageAuth>

+ 206 - 0
src/views/mobile/shopStock/components/add-dialog.vue

@@ -0,0 +1,206 @@
+<script setup lang="ts">
+import { FormRules, ElForm, ElMessage } from "element-plus";
+import { reactive, ref } from "vue";
+import { httpAdd, httpUpdate, httpDetail } from "/@/api/mobile/shopStock";
+import { responseHandle } from "/@/utils/responseHandle";
+import { useNav } from "/@/layout/hooks/useNav";
+import OrderDialog from "/@/components/PageListModal";
+import LadderTable from "./ladder-table.vue";
+// import LadderModal from "./ladder-modal.vue";
+enum FROM_TYPE {
+  create = "create",
+  edit = "edit",
+  view = "view"
+}
+const { logout } = useNav();
+const showModel = ref(false);
+const TYPE = ref<FROM_TYPE>(FROM_TYPE.create);
+// const ladderModalRef = ref<InstanceType<typeof LadderModal>>(null);
+
+const formRef = ref<InstanceType<typeof ElForm>>(null);
+const modelOrderRef = ref<InstanceType<typeof OrderDialog>>(null);
+const loading = ref(false);
+const titleType = ref("");
+const inventory = ref(0);
+const id = ref("");
+const emit = defineEmits(["reload"]);
+const initform = {
+  list: []
+};
+const ruleForm = ref({ ...initform });
+const rules = reactive<FormRules>({
+  list: [
+    { required: true, type: "array", trigger: "change", message: "选择商品!" }
+  ]
+});
+
+const initData = async () => {
+  const { code, data, message } = await httpDetail({ id: id.value });
+  responseHandle({
+    code,
+    message,
+    logout,
+    handler: () => {
+      Object.keys(ruleForm.value).forEach(key => {
+        if (key === "flag") {
+          ruleForm.value[key] = "1";
+        } else {
+          ruleForm.value[key] = data[key] ? data[key] + "" : "";
+        }
+      });
+      inventory.value = Number(data.inventory);
+    }
+  });
+};
+function handleAddOrder(list) {
+  console.log(list);
+  list.forEach(item => {
+    const { id } = item;
+    let findex = ruleForm.value.list.findIndex(e => e.id + "" == id + "");
+    if (findex == -1) {
+      const model = Object.assign(item, {
+        inventory: 100
+      });
+      ruleForm.value.list.push(model);
+    }
+  });
+}
+async function show(node: any, did: string, isCreate: string) {
+  id.value = did;
+  loading.value = true;
+  Object.keys(ruleForm.value).forEach(key => {
+    ruleForm.value[key] = initform[key];
+  });
+  TYPE.value = isCreate;
+  switch (TYPE.value) {
+    case "create":
+      titleType.value = "新建商城商品库存";
+      break;
+    case "edit":
+      titleType.value = "编辑商城商品库存";
+      break;
+    case "view":
+      titleType.value = "商城商品库存详情";
+      break;
+    default:
+      titleType.value = "新建商城商品库存";
+  }
+
+  showModel.value = true;
+  if (TYPE.value !== "create") {
+    await initData();
+  }
+  loading.value = false;
+}
+function handleUpdate() {
+  const data = {
+    ...ruleForm.value
+  };
+
+  return {
+    data,
+    api: httpUpdate
+  };
+}
+function handleCreate() {
+  const data = {
+    ...ruleForm.value
+  };
+
+  return {
+    data,
+    api: httpAdd
+  };
+}
+
+function handleSave() {
+  formRef.value.validate(async vaild => {
+    if (vaild) {
+      if (loading.value) return;
+      loading.value = true;
+      const handler =
+        TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
+      const { api, data } = handler();
+      const { list } = data;
+      const model = {
+        list: []
+      };
+      let isok = true;
+      list.forEach(si => {
+        if (Number.isNaN(si.inventory) || Number(si.inventory) === 0) {
+          isok = false;
+        }
+        model.list.push({ good_id: si.id, inventory: si.inventory });
+      });
+      if (!isok) {
+        ElMessage.warning("部分商品添加库存数为0!");
+        loading.value = false;
+        return;
+      }
+      const { message, code } = await api(model);
+      loading.value = false;
+      responseHandle({
+        code,
+        message,
+        logout,
+        handler: () => {
+          showModel.value = false;
+          emit("reload");
+        }
+      });
+    }
+  });
+}
+defineExpose({
+  show
+});
+</script>
+
+<template>
+  <el-dialog
+    v-model="showModel"
+    :close-on-press-escape="false"
+    center
+    append-to-body
+    destroy-on-close
+    :width="'1040px'"
+    :title="titleType"
+    v-loading="loading"
+  >
+    <el-form
+      ref="formRef"
+      :model="ruleForm"
+      :rules="rules"
+      label-width="100px"
+      style="margin-top: -10px"
+      class="demo-ruleForm"
+      status-icon
+    >
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="商品信息" prop="list">
+            <LadderTable
+              :readonly="false"
+              :ladder="ruleForm.list"
+              @choose="() => modelOrderRef.show('', '2')"
+              @delete="index => ruleForm.list.splice(index, 1)"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24" class="flex justify-end">
+          <el-button
+            v-if="TYPE !== 'view'"
+            :loading="loading"
+            :disabled="loading"
+            type="primary"
+            @click="handleSave"
+            >保存</el-button
+          >
+          <el-button @click="showModel = false">取消</el-button>
+        </el-col>
+      </el-row>
+    </el-form>
+  </el-dialog>
+  <OrderDialog ref="modelOrderRef" @save-btn-click="handleAddOrder" />
+</template>

+ 219 - 0
src/views/mobile/shopStock/components/edit-dialog.vue

@@ -0,0 +1,219 @@
+<script setup lang="ts">
+import { FormRules, ElForm, ElMessage } from "element-plus";
+import { reactive, ref } from "vue";
+import { httpUpdate, httpDetail } from "/@/api/mobile/shopStock";
+import { responseHandle } from "/@/utils/responseHandle";
+import { useNav } from "/@/layout/hooks/useNav";
+import { FLAG_OPTIONS } from "/@/config/status";
+enum FROM_TYPE {
+  create = "create",
+  edit = "edit",
+  view = "view"
+}
+const { logout } = useNav();
+const showModel = ref(false);
+const TYPE = ref<FROM_TYPE>(FROM_TYPE.create);
+const formRef = ref<InstanceType<typeof ElForm>>(null);
+const loading = ref(false);
+const titleType = ref("");
+const inventory = ref(0);
+const id = ref("");
+const emit = defineEmits(["reload"]);
+const initform = {
+  id: "",
+  number: 1,
+  inventory: 0,
+  flag: "1"
+};
+const ruleForm = ref({ ...initform });
+const rules = reactive<FormRules>({
+  number: [{ required: true, trigger: "change", message: "请选择变动数!" }],
+  flag: [{ required: true, trigger: "change", message: "选择变动类型" }]
+});
+
+const initData = async () => {
+  const { code, data, message } = await httpDetail({ id: id.value });
+  responseHandle({
+    code,
+    message,
+    logout,
+    handler: () => {
+      Object.keys(ruleForm.value).forEach(key => {
+        if (key === "flag") {
+          ruleForm.value[key] = "1";
+        } else {
+          ruleForm.value[key] = data[key] ? data[key] + "" : "";
+        }
+      });
+      inventory.value = Number(data.inventory);
+    }
+  });
+};
+async function show(node: any, did: string, isCreate: string) {
+  id.value = did;
+  loading.value = true;
+  Object.keys(ruleForm.value).forEach(key => {
+    ruleForm.value[key] = initform[key];
+  });
+  TYPE.value = isCreate;
+  switch (TYPE.value) {
+    case "create":
+      titleType.value = "新建兑换商品库存";
+      break;
+    case "edit":
+      titleType.value = "编辑兑换商品库存";
+      break;
+    case "view":
+      titleType.value = "兑换商品库存详情";
+      break;
+    default:
+      titleType.value = "新建兑换商品库存";
+  }
+
+  showModel.value = true;
+  if (TYPE.value !== "create") {
+    await initData();
+  }
+  loading.value = false;
+}
+function handleUpdate() {
+  const data = {
+    ...ruleForm.value
+  };
+
+  return {
+    data,
+    api: httpUpdate
+  };
+}
+
+function handleSave() {
+  formRef.value.validate(async vaild => {
+    if (vaild) {
+      if (loading.value) return;
+      loading.value = true;
+      const handler = handleUpdate;
+      const { api, data } = handler();
+      const { flag, number } = data;
+      if (flag === "-1") {
+        if (Number(number) > Number(inventory.value)) {
+          ElMessage.warning(
+            `减少库存操作时,变动库存不能大于当前库存${inventory.value}!`
+          );
+          loading.value = false;
+          return;
+        }
+      }
+      const { message, code } = await api(data);
+      loading.value = false;
+      responseHandle({
+        code,
+        message,
+        logout,
+        handler: () => {
+          showModel.value = false;
+          emit("reload");
+        }
+      });
+    }
+  });
+}
+defineExpose({
+  show
+});
+</script>
+
+<template>
+  <el-dialog
+    v-model="showModel"
+    :close-on-press-escape="false"
+    center
+    append-to-body
+    destroy-on-close
+    :width="'1040px'"
+    :title="titleType"
+    v-loading="loading"
+  >
+    <el-form
+      ref="formRef"
+      :model="ruleForm"
+      :rules="rules"
+      label-width="100px"
+      style="margin-top: -10px"
+      class="demo-ruleForm"
+      status-icon
+    >
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="当前库存数" prop="inventory">
+            <el-input-number
+              v-model="ruleForm.inventory"
+              :step="1"
+              :min="0"
+              :disabled="true"
+              :precision="0"
+              style="width: 100%"
+              :max="99999999"
+              value-on-clear="min"
+              controls-position="right"
+              step-strictly
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6" v-if="TYPE !== 'view'">
+          <el-form-item label="变动状态" prop="flag">
+            <el-select
+              v-model="ruleForm.flag"
+              placeholder="变动状态"
+              :disabled="TYPE === 'view'"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="(item, index) in FLAG_OPTIONS"
+                :label="item.label"
+                :value="item.id"
+                :key="item.id + index"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="6" v-if="TYPE !== 'view'">
+          <el-form-item label="变动数量" prop="number">
+            <el-input-number
+              v-model="ruleForm.number"
+              :step="1"
+              :min="1"
+              :disabled="TYPE === 'view'"
+              :precision="0"
+              style="width: 100%"
+              :max="99999999"
+              value-on-clear="min"
+              controls-position="right"
+              step-strictly
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="TYPE !== 'view' ? 6 : 18" class="flex justify-end">
+          <el-button
+            v-if="TYPE !== 'view'"
+            :loading="loading"
+            :disabled="loading"
+            type="primary"
+            @click="handleSave"
+            >保存</el-button
+          >
+          <el-button @click="showModel = false">取消</el-button>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="账号信息"> 111 </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="商品信息"> 22 </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+  </el-dialog>
+</template>

+ 1 - 1
src/views/mobile/shopStock/cpns/ladder-table.vue → src/views/mobile/shopStock/components/ladder-table.vue

@@ -33,7 +33,7 @@ defineProps<{
           :preview-src-list="
             row.good_cover_img !== '' ? [row.good_cover_img] : []
           "
-          z-index="99999"
+          :z-index="99999"
           preview-teleported
         />
       </template>

+ 13 - 2
src/views/mobile/shopStock/config/content.config1.ts → src/views/mobile/shopStock/config/ListModal.config.ts

@@ -1,6 +1,11 @@
-// import { ModalConfig } from "/@/components/PageListModal2";
+import { ModalConfig } from "/@/components/ListModal";
 import { httpLog } from "/@/api/mobile/shopStock";
 import { renderImage } from "/@/utils/column-helper";
+import { FormConfig } from "/@/components/PageSearch";
+const searchFormConfig: FormConfig = {
+  isHide: true,
+  formItems: []
+};
 const columns = [
   {
     type: "selection",
@@ -92,4 +97,10 @@ const contentConfig = {
   }
 };
 
-export default contentConfig;
+const ListModalConfig: ModalConfig = {
+  title: "库存修改记录",
+  searchConfig: searchFormConfig,
+  contentConfig: contentConfig
+};
+
+export default ListModalConfig;

+ 0 - 100
src/views/mobile/shopStock/config/_details.ts

@@ -1,100 +0,0 @@
-/* eslint-disable prettier/prettier */
-import { h } from "vue";
-import { ElImage, ElTag } from "element-plus";
-import { DescriptionColumns } from "/@/components/BasicDescriptions";
-import { FormConfig } from "/@/components/PageSearch";
-import { createTooltip } from "/@/utils/tooltip";
-import { GOOD_OPTIONS } from "/@/config/status";
-import {
-  renderImage,
-  renderImages,
-  renderGoodParam
-} from "/@/utils/column-helper";
-// import { payWayOptions, sendWayOptions, supplyAreaOptions } from "./_options";
-
-export const projectFormConfig: FormConfig = {
-  labelWidth: "100px",
-  formItems: [
-    {
-      label: "商品信息",
-      field: "list",
-      type: "array",
-      placeholder: "商品信息",
-      span: 24,
-      slot: "list"
-    }
-  ]
-};
-
-export const bargainColumns: DescriptionColumns = [
-  {
-    field: "good_cover_img",
-    label: "封面图",
-    span: 4,
-    render: (_, row) => renderImage("good_cover_img").cellRenderer({ row })
-  },
-  {
-    field: "good_name",
-    label: "商品名称",
-    span: 20
-  },
-  {
-    field: "good_code",
-    label: "商品编码",
-    span: 6
-  },
-  {
-    field: "unit",
-    label: "单位",
-    span: 6
-  },
-  {
-    field: "moq",
-    label: "起订量",
-    span: 6
-  },
-  {
-    field: "step",
-    label: "步长",
-    span: 6
-  },
-  {
-    field: "price",
-    label: "售价",
-    span: 8
-  },
-  {
-    field: "inventory",
-    label: "当前库存数",
-    span: 8
-  },
-  {
-    field: "updatetime",
-    label: "更新时间",
-    span: 8
-  },
-
-  {
-    field: "good_banner_img",
-    label: "轮播图",
-    span: 12,
-    render: (_, row) => renderImages("good_banner_img").cellRenderer({ row })
-  },
-  {
-    field: "good_img",
-    label: "详情图",
-    render: (_, row) => renderImages("good_img").cellRenderer({ row }),
-    span: 12
-  },
-  {
-    field: "good_param",
-    label: "商品参数",
-    render: (_, row) => renderGoodParam("good_param").cellRenderer({ row }),
-    span: 24
-  },
-  {
-    field: "good_remark",
-    label: "商品备注",
-    span: 24
-  }
-];

+ 0 - 33
src/views/mobile/shopStock/config/_rules.ts

@@ -1,33 +0,0 @@
-import { FormRules } from "element-plus";
-
-export const ladderFormRules: FormRules = {
-  key: {
-    trigger: "change",
-    required: true,
-    message: "请选择商品类型"
-  },
-  value: {
-    trigger: "change",
-    required: true,
-    message: "请选择单位"
-  }
-};
-
-export const projectFormRules: FormRules = {
-  number: {
-    trigger: "change",
-    required: true,
-    validator(_, value) {
-      if (value === "") return new Error("请输入库存变动数");
-      return true;
-    }
-  },
-  flag: {
-    trigger: "change",
-    required: true,
-    validator(_, value) {
-      if (value.length === 0) return new Error("请选择修改状态!");
-      return true;
-    }
-  }
-};

+ 3 - 24
src/views/mobile/shopStock/config/content.config.ts

@@ -1,23 +1,7 @@
-import { isString } from "@pureadmin/utils";
-import { h } from "vue";
 import { ContentConfig } from "/@/components/PageContent";
-import {
-  // httpDelete,
-  // httpStatus,
-  httpList,
-  httpAdd,
-  httpLog,
-  httpUpdate
-} from "/@/api/mobile/shopStock";
-import { STATUS_OPTIONS } from "/@/config/status";
-import { ElTag } from "element-plus";
+import { httpList } from "/@/api/mobile/shopStock";
 import { renderImage } from "/@/utils/column-helper";
 const columns = [
-  {
-    type: "selection",
-    width: 55,
-    hide: ({ checkList }) => !checkList.includes("勾选列")
-  },
   {
     prop: "good_code",
     label: "商品编码",
@@ -79,15 +63,10 @@ const columns = [
   }
 ];
 const contentConfig: ContentConfig = {
-  title: "商城商品库存",
+  title: "卡类型管理",
   columns,
   apis: {
-    httpAdd,
-    // httpDelete,
-    // httpStatus,
-    httpList,
-    httpLog,
-    httpUpdate
+    httpList
   }
 };
 

+ 0 - 64
src/views/mobile/shopStock/config/modal.config.ts

@@ -1,64 +0,0 @@
-import { ModalConfig } from "/@/components/PageModal/src/types";
-import { isLicense } from "/@/utils/validate";
-
-const modalConfig: ModalConfig = {
-  title: "商城商品库存",
-  colLayout: { span: 24 },
-  itemStyle: {},
-  contact: "invoice_mobile",
-  formItems: [
-    {
-      field: "video_sn",
-      type: "input",
-      label: "视频编号",
-      isHidden: true,
-      labelWidth: "120px",
-      placeholder: "视频编号"
-    },
-
-    {
-      field: "nickname",
-      type: "input",
-      label: "视频名称",
-      labelWidth: "120px",
-      placeholder: "视频名称",
-      rules: [{ required: true, trigger: "change", message: "请输入视频名称" }]
-    },
-    {
-      field: "mobile",
-      type: "input",
-      label: "视频链接",
-      labelWidth: "120px",
-      placeholder: "视频链接",
-      rules: [{ required: true, trigger: "change", message: "请输入视频链接" }]
-    },
-    {
-      field: "remark",
-      type: "input",
-      label: "视频描述",
-      labelWidth: "120px",
-      placeholder: "视频描述",
-      rules: [{ required: true, trigger: "change", message: "请输入视频描述" }]
-    },
-    {
-      field: "video_img",
-      type: "img_upload",
-      label: "视频封面",
-      labelWidth: "120px",
-      placeholder: "视频封面",
-      rules: [
-        { required: true, trigger: "change", message: "请上传视频封面!" }
-      ]
-    },
-    {
-      field: "video_set",
-      type: "input",
-      label: "视频设置",
-      labelWidth: "120px",
-      isHidden: true,
-      placeholder: "视频设置"
-    }
-  ]
-};
-
-export default modalConfig;

+ 9 - 9
src/views/mobile/shopStock/config/search.config.ts

@@ -1,5 +1,5 @@
 import { FormConfig } from "/@/components/PageSearch";
-import { STATUS_OPTIONS } from "/@/config/status";
+import { ACCOUNT_STATUS_OPTIONS } from "/@/config/status";
 import { convertOptions } from "/@/utils/column-helper";
 
 const searchFormConfig: FormConfig = {
@@ -7,23 +7,23 @@ const searchFormConfig: FormConfig = {
     {
       field: "status",
       type: "select",
-      placeholder: "视频状态",
-      options: convertOptions(STATUS_OPTIONS)
+      placeholder: "账号状态",
+      options: convertOptions(ACCOUNT_STATUS_OPTIONS)
     },
     {
-      field: "video_name",
+      field: "username",
       type: "input",
-      placeholder: "视频名称"
+      placeholder: "账号"
     },
     {
-      field: "video_url",
+      field: "nickname",
       type: "input",
-      placeholder: "视频地址"
+      placeholder: "客户姓名"
     },
     {
-      field: "video_sn",
+      field: "mobile",
       type: "input",
-      placeholder: "视频编号"
+      placeholder: "客户手机号"
     }
   ]
 };

+ 0 - 31
src/views/mobile/shopStock/config/search.config1.ts

@@ -1,31 +0,0 @@
-import { FormConfig } from "/@/components/PageSearch";
-import { STATUS_OPTIONS } from "/@/config/status";
-import { convertOptions } from "/@/utils/column-helper";
-
-const searchFormConfig: FormConfig = {
-  formItems: [
-    {
-      field: "status",
-      type: "select",
-      placeholder: "视频状态",
-      options: convertOptions(STATUS_OPTIONS)
-    },
-    {
-      field: "video_name",
-      type: "input",
-      placeholder: "视频名称"
-    },
-    {
-      field: "video_url",
-      type: "input",
-      placeholder: "视频地址"
-    },
-    {
-      field: "video_sn",
-      type: "input",
-      placeholder: "视频编号"
-    }
-  ]
-};
-
-export default searchFormConfig;

+ 0 - 176
src/views/mobile/shopStock/cpns/addModel.vue

@@ -1,176 +0,0 @@
-<script setup lang="ts">
-import { computed, ref, watchEffect, reactive, unref } from "vue";
-import { ActionType } from "/@/components/PageContent";
-import { createBasicTitle } from "./utils/create-basic-title";
-import BasicDescriptions from "/@/components/BasicDescriptions";
-import { ElForm, ElMessage } from "element-plus";
-import type { FormInstance, FormRules } from "element-plus";
-import { projectFormRules } from "../config/_rules";
-import { FLAG_OPTIONS } from "/@/config/status";
-import { useNav } from "/@/layout/hooks/useNav";
-import { bargainColumns } from "../config/_details";
-const { logout } = useNav();
-import { httpAdd, httpDetail, httpUpdate } from "/@/api/mobile/shopStock";
-const emit = defineEmits(["submitOk"]);
-const ruleFormRef = ref<FormInstance>();
-const form = {
-  id: "",
-  number: 1,
-  flag: "1"
-};
-const ruleForm = reactive({ ...form });
-const type = ref<ActionType>("preview");
-const dialogVisible = ref(false);
-const confirmLoading = ref(false);
-const title = ref("");
-const uID = ref("");
-const bargain = ref({});
-
-const submitForm = async (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  await formEl.validate(async (valid, fields) => {
-    if (valid) {
-      if (confirmLoading.value) return;
-      confirmLoading.value = true;
-      const model = unref(ruleForm);
-      const { flag, number } = model;
-      const { inventory } = bargain;
-      if (flag === "-1") {
-        if (Number(number) > Number(inventory)) {
-          ElMessage.warning("减少库存操作时,变动库存不能大于当前库存!");
-          return;
-        }
-      }
-      let res = {};
-      if (type.value == "create") {
-        delete model["id"];
-        res = await httpAdd(model);
-      } else {
-        res = await httpUpdate(model);
-      }
-      const { code: hcode, data, message } = res;
-      confirmLoading.value = false;
-      if (hcode === 0) {
-        dialogVisible.value = false;
-        emit("submitOk", {});
-      } else if (hcode >= 100 && hcode <= 104) {
-        logout();
-      } else {
-        ElMessage.warning(message);
-      }
-    } else {
-      console.log("error submit!", fields);
-    }
-    handleAddOrder;
-  });
-};
-
-function handleAddOrder(list) {
-  console.log(list);
-}
-const initData = async () => {
-  if (confirmLoading.value) return;
-  confirmLoading.value = true;
-  const { code, data, message } = await httpDetail({ id: uID.value });
-  if (code === 0) {
-    bargain.value = data;
-    const { id } = data;
-    ruleForm.id = id;
-  } else if (code >= 100 && code <= 104) {
-    logout();
-  } else {
-    ElMessage.warning(message);
-  }
-  confirmLoading.value = false;
-};
-defineExpose({
-  onShow: async (basicTitle: string, readonly: ActionType, id: string) => {
-    type.value = readonly;
-    const readTitle = createBasicTitle(type.value);
-    title.value =
-      readonly == "preview" ? basicTitle + readTitle : readTitle + basicTitle;
-    Object.keys(ruleForm).forEach(key => {
-      ruleForm[key] = form[key];
-    });
-    dialogVisible.value = true;
-    confirmLoading.value = false;
-    uID.value = id;
-    bargain.value = {};
-    if (type.value !== "create") {
-      await initData();
-    }
-  }
-});
-</script>
-
-<template>
-  <el-dialog
-    :title="title"
-    v-model="dialogVisible"
-    center
-    top="5vh"
-    destroy-on-close
-    width="1024px"
-  >
-    <BasicDescriptions
-      labelWidth="120"
-      v-if="bargain && bargain?.id"
-      :columns="bargainColumns"
-      :data="bargain"
-    />
-    <el-form
-      ref="ruleFormRef"
-      v-loading="confirmLoading"
-      :model="ruleForm"
-      v-show="type !== 'preview'"
-      :rules="projectFormRules"
-      label-width="100px"
-      :disabled="type === 'preview'"
-      status-icon
-    >
-      <el-row style="padding: 20px 0 0 0">
-        <el-col :span="8">
-          <el-form-item label="变动状态" prop="flag">
-            <el-select
-              v-model="ruleForm.flag"
-              placeholder="变动状态"
-              style="width: 100%"
-            >
-              <el-option
-                v-for="(item, index) in FLAG_OPTIONS"
-                :label="item.label"
-                :value="item.id"
-                :key="item.id + index"
-              />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="变动数量" prop="number">
-            <el-input-number
-              v-model="ruleForm.number"
-              :step="1"
-              :min="1"
-              :precision="0"
-              style="width: 100%"
-              :max="99999999"
-              value-on-clear="min"
-              controls-position="right"
-              step-strictly
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item>
-            <div class="w-full flex justify-end">
-              <el-button type="primary" @click="submitForm(ruleFormRef)"
-                >提交</el-button
-              >
-              <ElButton @click="() => (dialogVisible = false)">取消</ElButton>
-            </div>
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-  </el-dialog>
-</template>

+ 0 - 11
src/views/mobile/shopStock/cpns/utils/create-basic-title.ts

@@ -1,11 +0,0 @@
-import { ActionType } from "/@/components/PageContent";
-
-const mapActionToBasicTitle = {
-  update: "编辑",
-  create: "新增",
-  preview: "详情"
-};
-
-export function createBasicTitle(type: ActionType) {
-  return mapActionToBasicTitle[type];
-}

+ 0 - 27
src/views/mobile/shopStock/cpns/utils/types.ts

@@ -1,27 +0,0 @@
-import { ActionType } from "/@/components/PageContent";
-import pageModal from "../addModel.vue";
-
-export type PageModalInstance = typeof pageModal & {
-  dialogVisible: boolean;
-  confirmLoading: boolean;
-  type: ActionType;
-  title: String;
-};
-export const modalProps = {
-  dialogVisible: {
-    type: Boolean,
-    required: Boolean
-  },
-  confirmLoading: {
-    type: Boolean,
-    default: false
-  },
-  type: {
-    type: Object as PropType<ActionType>,
-    required: true
-  },
-  title: {
-    type: String,
-    required: true
-  }
-};

+ 163 - 139
src/views/mobile/shopStock/index.vue

@@ -1,160 +1,184 @@
 <script setup lang="ts">
-import { ref, unref } from "vue";
+import { ref } from "vue";
+import { usePermission } from "/@/hooks/usePermission";
+
 import { PageSearch, usePageSearch } from "/@/components/PageSearch";
+import { PageContent } from "/@/components/PageContent";
 import searchConfig from "./config/search.config";
 import contentConfig from "./config/content.config";
-// import PageAuth from "/@/components/PageAuth";
-import { PageModal, usePageModal } from "/@/components/PageModalShell";
-import modalConfig from "./config/modal.config";
-import { PageContent } from "/@/components/PageContent";
-import { projectFormConfig } from "./config/_details";
-import { projectFormRules } from "./config/_rules";
-import {
-  BasicForm,
-  transform,
-  createDefaultData
-} from "/@/components/BasicForm";
+import EditModel from "./components/edit-dialog.vue";
+import AddModel from "./components/add-dialog.vue";
+import ListModalConfig from "./config/ListModal.config";
+// import { PageModal, usePageModal } from "/@/components/PageModalShell";
+// import modalConfig from "./config/modal.config";
 
-import addModel from "./cpns/addModel.vue";
-import { useResponseHandle } from "/@/hooks/useAsync";
-import LadderModal from "./cpns/ladder-modal.vue";
-import LadderTable from "./cpns/ladder-table.vue";
-import { ComCard } from "/@/components/RemoteSelect";
-import OrderDialog from "/@/components/PageListModal";
-import { ElForm, ElMessage } from "element-plus";
-import PageListModall from "/@/components/PageListModall";
-import contentConfig1 from "./config/content.config1";
+// import { projectFormConfig } from "./config/_details";
+// import { projectFormRules } from "./config/_rules";
 
-const responseHandle = useResponseHandle();
-const ladderModalRef = ref<InstanceType<typeof LadderModal>>(null);
-const modelRef = ref<InstanceType<typeof OrderDialog>>(null);
-const actionModalRef = ref<InstanceType<typeof addModel>>(null);
+// import {
+//   BasicForm,
+//   transform,
+//   createDefaultData
+// } from "/@/components/BasicForm";
+
+// import addModel from "./components/addModel.vue";
+// import { useResponseHandle } from "/@/hooks/useAsync";
+// import LadderTable from "./components/ladder-table.vue";
+// import { ComCard } from "/@/components/RemoteSelect";
+// import OrderDialog from "/@/components/PageListModal";
+// import { ElForm, ElMessage } from "element-plus";
+import ListModal from "/@/components/ListModal";
+const pageName = "shopStock";
+const { hasPermissionWithCode, permissions } = usePermission(pageName);
+const modelEditRef = ref<InstanceType<typeof EditModel>>(null);
+const modelAddRef = ref<InstanceType<typeof AddModel>>(null);
+// const responseHandle = useResponseHandle();
+// const modelOrderRef = ref<InstanceType<typeof OrderDialog>>(null);
+// const actionModalRef = ref<InstanceType<typeof addModel>>(null);
 const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch(
   undefined,
   undefined,
   searchConfig
 );
-const { pageModalRef, handleCreateData, handleConfrim, defaultInfo } =
-  usePageModal({
-    pageContentRef
-  });
-
-const { formItems } = projectFormConfig;
-const PageListModalReff = ref<InstanceType<typeof PageListModall>>(null);
-const basicFormRef = ref<InstanceType<typeof ElForm>>(null);
-const formData = ref<Record<string, any>>(createDefaultData(formItems));
-function handleCreate() {
-  basicFormRef.value.validate(isValid => {
-    if (!isValid) return;
-    const { group_id, list } = formData.value;
-    const params = {
-      group_id,
-      list: []
-    };
-    let isok = true;
-    list.forEach(item => {
-      const num = Number(item.inventory ?? "");
-      const model = {
-        good_id: item.id,
-        inventory: num
-      };
-      params.list.push(model);
-      if (num === 0) {
-        isok = false;
-      }
-    });
-    if (!isok) {
-      ElMessage.warning("库存数不能为空!");
-      return;
-    }
+// const { pageModalRef, handleCreateData, handleConfrim, defaultInfo } =
+//   usePageModal({
+//     pageContentRef
+//   });
+const ListModalRef = ref<InstanceType<typeof ListModal>>(null);
+// const { formItems } = projectFormConfig;
+// const basicFormRef = ref<InstanceType<typeof ElForm>>(null);
+// const formData = ref<Record<string, any>>(createDefaultData(formItems));
+// function handleCreate() {
+//   basicFormRef.value.validate(isValid => {
+//     if (!isValid) return;
+//     const { group_id, list } = formData.value;
+//     const params = {
+//       group_id,
+//       list: []
+//     };
+//     let isok = true;
+//     list.forEach(item => {
+//       const num = Number(item.inventory ?? "");
+//       const model = {
+//         good_id: item.id,
+//         inventory: num
+//       };
+//       params.list.push(model);
+//       if (num === 0) {
+//         isok = false;
+//       }
+//     });
+//     if (!isok) {
+//       ElMessage.warning("库存数不能为空!");
+//       return;
+//     }
 
-    handleConfrim("create", params);
-    // emit("create", params);
-  });
-}
-function Create() {
-  pageContentRef.value.getPageData({ id: "" });
+//     handleConfrim("create", params);
+//     // emit("create", params);
+//   });
+// }
+// async function handleDetailData(id, type) {
+//   actionModalRef.value.onShow("兑换商品库存", type, id);
+// }
+// function modularShow() {
+//   if (!formData.value.group_id) return ElMessage.warning("请选择公司卡类型!");
+//   modelOrderRef.value.show(formData.value.group_id, "1");
+// }
+// function handleAddOrder(list) {
+//   console.log(list);
+//   list.forEach(item => {
+//     const { id } = item;
+//     let findex = formData.value.list.findIndex(e => e.id + "" == id + "");
+//     if (findex == -1) {
+//       let model = Object.assign(item, {
+//         img: item.good_cover_img,
+//         good_id: item.id,
+//         jump_type: "2",
+//         jump_param: `/good?id=${item.id}`,
+//         style_type: "",
+//         title: ""
+//       });
+//       formData.value.list.push(model);
+//     }
+//   });
+// }
+function showLog(id) {
+  console.log(id);
+  ListModalRef.value.show(id);
 }
-async function handleDetailData(id, type) {
-  actionModalRef.value.onShow("兑换商品库存", type, id);
-}
-function modularShow() {
-  // if (!formData.value.group_id) return ElMessage.warning("请选择公司卡类型!");
-  modelRef.value.show("", "2");
-}
-function handleAddOrder(list) {
-  console.log(list);
-  list.forEach(item => {
-    const { id } = item;
-    let findex = formData.value.list.findIndex(e => e.id + "" == id + "");
-    if (findex == -1) {
-      let model = Object.assign(item, {
-        img: item.good_cover_img,
-        good_id: item.id,
-        jump_type: "2",
-        jump_param: `/good?id=${item.id}`,
-        style_type: "",
-        title: ""
-      });
-      formData.value.list.push(model);
-    }
-  });
-}
-function aa(id) {
-  console.log(PageListModalReff);
-  PageListModalReff.value.show(id);
-  // console.log(id);
+function handleAddChangeCheck(item: any, id: string, type: string) {
+  if (type === "create") {
+    modelAddRef.value.show(item, id, type);
+  } else {
+    modelEditRef.value.show(item, id, type);
+  }
 }
 </script>
 
 <template>
-  <!-- <PageAuth :pageName="pageName"> -->
-  <PageSearch
-    :form-config="searchConfig"
-    @search-btn-click="handleSearchClick"
-    @reset-btn-click="handleResetClick"
-  />
-  <PageContent
-    ref="pageContentRef"
-    :content-config="contentConfig"
-    @create-btn-click="handleCreateData"
-    @preview-btn-click="({ id }) => handleDetailData(id, 'preview')"
-    @update-btn-click="({ id }) => handleDetailData(id, 'update')"
-    @log-btn-click="({ id }) => aa(id)"
-  />
-  <PageListModal2 ref="PageListModalReff" :modal-config="contentConfig1" />
-  <PageModal
-    ref="pageModalRef"
-    :modal-config="modalConfig"
-    :default-info="defaultInfo"
-    @confirm-btn-click="handleConfrim"
-  >
-    <BasicForm
-      ref="basicFormRef"
-      v-bind="projectFormConfig"
-      :form-data="formData"
-      :rules="projectFormRules"
-      :disabled="false"
-      label-width="120px"
+  <PageAuth :pageName="pageName">
+    <PageSearch
+      :form-config="searchConfig"
+      @search-btn-click="handleSearchClick"
+      @reset-btn-click="handleResetClick"
     >
-      <template #list>
-        <LadderTable
-          :readonly="false"
-          :ladder="formData.list"
-          @choose="() => modularShow()"
-          @update="({ data, index }) => ladderModalRef.onDisplay(data, index)"
-          @delete="index => formData.list.splice(index, 1)"
-        />
+      <template #action>
+        <el-button
+          type="primary"
+          @click="handleAddChangeCheck({}, '', 'create')"
+          v-if="hasPermissionWithCode('002')"
+        >
+          新增
+        </el-button>
       </template>
-      <template #footer>
-        <div class="w-full flex justify-end">
-          <ElButton type="primary" @click="handleCreate">保存</ElButton>
-        </div>
-      </template>
-    </BasicForm>
-  </PageModal>
+    </PageSearch>
+    <PageContent
+      ref="pageContentRef"
+      :powers="permissions"
+      :content-config="contentConfig"
+      @preview-btn-click="row => handleAddChangeCheck(row, row.id, 'view')"
+      @update-btn-click="row => handleAddChangeCheck(row, row.id, 'edit')"
+      @log-btn-click="({ id }) => showLog(id)"
+    />
 
-  <OrderDialog ref="modelRef" @save-btn-click="handleAddOrder" />
-  <addModel ref="actionModalRef" @submitOk="Create" />
-  <!-- </PageAuth> -->
+    <!-- <PageModal
+      ref="pageModalRef"
+      :modal-config="modalConfig"
+      :default-info="defaultInfo"
+      @confirm-btn-click="handleConfrim"
+    >
+      <BasicForm
+        ref="basicFormRef"
+        v-bind="projectFormConfig"
+        :form-data="formData"
+        :rules="projectFormRules"
+        :disabled="false"
+        label-width="120px"
+      >
+        <template #group_id>
+          <ComCard v-model="formData.group_id" placeholder="公司卡类型" />
+        </template>
+        
+        <template #list>
+          <LadderTable
+            :readonly="false"
+            :ladder="formData.list"
+            @choose="() => modularShow()"
+            @update="({ data, index }) => formData.list.splice(index, 1)"
+            @delete="index => formData.list.splice(index, 1)"
+          />
+        </template>
+        <template #footer>
+          <div class="w-full flex justify-end">
+            <ElButton type="primary" @click="handleCreate">保存</ElButton>
+          </div>
+        </template>
+      </BasicForm>
+    </PageModal> -->
+    <AddModel ref="modelAddRef" @reload="pageContentRef.onSearch()" />
+    <EditModel ref="modelEditRef" @reload="pageContentRef.onSearch()" />
+    <!-- <OrderDialog ref="modelOrderRef" @save-btn-click="handleAddOrder" /> -->
+    <!-- <addModel ref="actionModalRef" @submitOk="Create" /> -->
+    <ListModal ref="ListModalRef" :modalConfig="ListModalConfig" />
+  </PageAuth>
 </template>