Kaynağa Gözat

feat:商品信息采集

caoliqin 2 hafta önce
ebeveyn
işleme
948a881a1d

+ 53 - 0
src/api/hisStore/storeProductUserRecord.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品信息采集记录列表
+export function listFsStoreProductUserRecord(query) {
+  return request({
+    url: '/store/store/storeProductUserRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商品信息采集记录详细
+export function getFsStoreProductUserRecord(id) {
+  return request({
+    url: '/store/store/storeProductUserRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商品信息采集记录
+export function addFsStoreProductUserRecord(data) {
+  return request({
+    url: '/store/store/storeProductUserRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品信息采集记录
+export function updateFsStoreProductUserRecord(data) {
+  return request({
+    url: '/store/store/storeProductUserRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品信息采集记录
+export function delFsStoreProductUserRecord(id) {
+  return request({
+    url: '/store/store/storeProductUserRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出商品信息采集记录
+export function exportFsStoreProductUserRecord(query) {
+  return request({
+    url: '/store/store/storeProductUserRecord/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/hisStore/storeProductUserRecordValue.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品信息采集记录值列表
+export function listFsStoreProductUserRecordValue(query) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商品信息采集记录值详细
+export function getFsStoreProductUserRecordValue(id) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商品信息采集记录值
+export function addFsStoreProductUserRecordValue(data) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品信息采集记录值
+export function updateFsStoreProductUserRecordValue(data) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品信息采集记录值
+export function delFsStoreProductUserRecordValue(id) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出商品信息采集记录值
+export function exportFsStoreProductUserRecordValue(query) {
+  return request({
+    url: '/FsStoreProductUserRecordValue/FsStoreProductUserRecordValue/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/hisStore/storeProductUserTemp.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品信息采集模板列表
+export function listFsStoreProductUserTemp(query) {
+  return request({
+    url: '/store/store/storeProductUserTemp/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商品信息采集模板详细
+export function getFsStoreProductUserTemp(id) {
+  return request({
+    url: '/store/store/storeProductUserTemp/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商品信息采集模板
+export function addFsStoreProductUserTemp(data) {
+  return request({
+    url: '/store/store/storeProductUserTemp',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品信息采集模板
+export function updateFsStoreProductUserTemp(data) {
+  return request({
+    url: '/store/store/storeProductUserTemp',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品信息采集模板
+export function delFsStoreProductUserTemp(id) {
+  return request({
+    url: '/store/store/storeProductUserTemp/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出商品信息采集模板
+export function exportFsStoreProductUserTemp(query) {
+  return request({
+    url: '/store/store/storeProductUserTemp/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/hisStore/storeProductUserTempField.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品信息采集模板字段列表
+export function listFsStoreProductUserTempField(query) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商品信息采集模板字段详细
+export function getFsStoreProductUserTempField(id) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField/' + id,
+    method: 'get'
+  })
+}
+
+// 新增商品信息采集模板字段
+export function addFsStoreProductUserTempField(data) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品信息采集模板字段
+export function updateFsStoreProductUserTempField(data) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品信息采集模板字段
+export function delFsStoreProductUserTempField(id) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出商品信息采集模板字段
+export function exportFsStoreProductUserTempField(query) {
+  return request({
+    url: '/FsStoreProductUserTempField/FsStoreProductUserTempField/export',
+    method: 'get',
+    params: query
+  })
+}

+ 310 - 0
src/views/hisStore/storeProductUserRecord/index.vue

@@ -0,0 +1,310 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="用户昵称" prop="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入用户昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="电话" prop="phone">
+        <el-input
+          v-model="queryParams.phone"
+          placeholder="请输入电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="姓名" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['store:storeProductUserRecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="recordList">
+      <el-table-column label="用户昵称" align="center" prop="nickName" show-overflow-tooltip />
+      <el-table-column label="电话" align="center" prop="phone" width="130" />
+      <el-table-column label="姓名" align="center" prop="name" show-overflow-tooltip />
+      <el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleDetail(scope.row)"
+            v-hasPermi="['store:storeProductUserRecord:query']"
+          >详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 详情抽屉 -->
+    <el-drawer
+      :visible.sync="detailOpen"
+      :with-header="false"
+      size="60%"
+      append-to-body
+    >
+      <div v-loading="detailLoading" class="record-detail">
+        <div class="record-detail-header">采集记录详情</div>
+
+        <div class="detail-section">
+          <div class="section-title">基础信息</div>
+          <el-descriptions :column="3" border>
+            <el-descriptions-item label="用户昵称">{{ detail.nickName || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="电话">{{ detail.phone || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="姓名">{{ detail.name || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="提交时间">{{ detail.createTime || '-' }}</el-descriptions-item>
+          </el-descriptions>
+        </div>
+
+        <div class="detail-section">
+          <div class="section-title">采集信息</div>
+          <el-descriptions :column="2" border class="mb16">
+            <el-descriptions-item label="模板标题">{{ detail.tempName || detail.templateTitle || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="关联商品">{{ detail.productName || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="备注" :span="2">{{ detail.remark || '-' }}</el-descriptions-item>
+          </el-descriptions>
+
+          <div class="section-subtitle">填写项</div>
+          <el-descriptions v-if="fieldValueList.length" :column="1" border>
+            <el-descriptions-item
+              v-for="(field, index) in fieldValueList"
+              :key="field.id || field.tempFieldId || index"
+              :label="getFieldLabel(field)"
+            >
+              <span v-if="getTextValue(field)">{{ getTextValue(field) }}</span>
+              <template v-else-if="getChoiceTags(field).length">
+                <el-tag
+                  v-for="tag in getChoiceTags(field)"
+                  :key="tag"
+                  size="mini"
+                  type="info"
+                  class="choice-tag"
+                >{{ tag }}</el-tag>
+              </template>
+              <span v-else class="empty-value">-</span>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-empty v-else description="暂无采集项" :image-size="80" />
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import {
+  listFsStoreProductUserRecord,
+  getFsStoreProductUserRecord,
+  exportFsStoreProductUserRecord
+} from '@/api/hisStore/storeProductUserRecord'
+
+export default {
+  name: 'FsStoreProductUserRecord',
+  data() {
+    return {
+      loading: true,
+      exportLoading: false,
+      detailLoading: false,
+      showSearch: true,
+      total: 0,
+      recordList: [],
+      detailOpen: false,
+      detail: {},
+      fieldValueList: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        nickName: null,
+        phone: null,
+        name: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listFsStoreProductUserRecord(this.queryParams).then(response => {
+        this.recordList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.detailOpen = true
+      this.detailLoading = true
+      this.detail = { ...row }
+      this.fieldValueList = []
+      getFsStoreProductUserRecord(row.id).then(response => {
+        const data = response.data || {}
+        this.detail = { ...row, ...data }
+        this.fieldValueList = this.extractFieldValueList(data)
+        this.detailLoading = false
+      }).catch(() => {
+        this.detailLoading = false
+      })
+    },
+    extractFieldValueList(data) {
+      const list = data.fieldValueList
+        || data.valueList
+        || data.recordValueList
+        || data.fieldList
+        || []
+      return Array.isArray(list) ? list : []
+    },
+    getFieldLabel(field) {
+      return field.fieldName || field.field_name || '未命名选项'
+    },
+    getTextValue(field) {
+      const value = field.fieldValue != null && field.fieldValue !== ''
+        ? field.fieldValue
+        : field.field_value
+      return value != null && String(value).trim() !== '' ? value : ''
+    },
+    getChoiceTags(field) {
+      const raw = field.valueJson != null && field.valueJson !== ''
+        ? field.valueJson
+        : field.value_json
+      if (raw == null || raw === '') {
+        return []
+      }
+      let parsed = raw
+      if (typeof raw === 'string') {
+        try {
+          parsed = JSON.parse(raw)
+        } catch (e) {
+          return [raw]
+        }
+      }
+      if (Array.isArray(parsed)) {
+        return parsed.filter(item => item != null && String(item).trim() !== '')
+      }
+      if (typeof parsed === 'object') {
+        if (Array.isArray(parsed.values)) {
+          return parsed.values.filter(item => item != null && String(item).trim() !== '')
+        }
+        if (parsed.value != null && String(parsed.value).trim() !== '') {
+          return [parsed.value]
+        }
+        if (parsed.label != null && String(parsed.label).trim() !== '') {
+          return [parsed.label]
+        }
+      }
+      return [String(parsed)]
+    },
+    handleExport() {
+      this.$confirm('是否确认导出商品信息采集记录?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.exportLoading = true
+        return exportFsStoreProductUserRecord(this.queryParams)
+      }).then(response => {
+        this.download(response.msg)
+        this.exportLoading = false
+      }).catch(() => {
+        this.exportLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.record-detail {
+  padding: 20px;
+  min-height: 100%;
+  background: #f0f2f5;
+}
+
+.record-detail-header {
+  margin-bottom: 16px;
+  padding: 16px 20px;
+  background: #fff;
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+}
+
+.detail-section {
+  margin-bottom: 16px;
+  padding: 16px 20px 20px;
+  background: #fff;
+}
+
+.section-title {
+  margin-bottom: 12px;
+  font-size: 15px;
+  font-weight: 600;
+  color: #303133;
+}
+
+.section-subtitle {
+  margin: 16px 0 10px;
+  font-size: 14px;
+  font-weight: 500;
+  color: #606266;
+}
+
+.mb16 {
+  margin-bottom: 16px;
+}
+
+.choice-tag {
+  margin-right: 6px;
+  margin-bottom: 4px;
+}
+
+.empty-value {
+  color: #c0c4cc;
+}
+</style>

+ 467 - 0
src/views/hisStore/storeProductUserTemp/index.vue

@@ -0,0 +1,467 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="模板标题" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入模板标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input
+          v-model="queryParams.remark"
+          placeholder="请输入备注"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['store:storeProductUserTemp:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:storeProductUserTemp:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:storeProductUserTemp:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="FsStoreProductUserTempList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="模板标题" align="center" prop="name" show-overflow-tooltip />
+      <el-table-column label="状态" align="center" prop="status" width="100">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="排序" align="center" prop="sort" width="80" />
+      <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:storeProductUserTemp:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:storeProductUserTemp:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改模板对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="1200px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="模板标题" prop="name">
+              <el-input v-model="form.name" placeholder="请输入模板标题" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="排序" prop="sort">
+              <el-input-number v-model="form.sort" :min="0" controls-position="right" style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="状态" prop="status">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in statusOptions"
+                  :key="dict.dictValue"
+                  :label="parseInt(dict.dictValue)"
+                >{{ dict.dictLabel }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
+        </el-form-item>
+        <el-form-item label="选项列表">
+          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="openFieldDialog">新增选项</el-button>
+          <el-table
+            :data="fieldList"
+            border
+            size="small"
+            style="width: 100%; margin-top: 10px;"
+            :cell-style="{ textAlign: 'center' }"
+            :header-cell-style="{ textAlign: 'center' }"
+          >
+            <el-table-column label="选项名称" prop="fieldName" min-width="120" show-overflow-tooltip />
+            <el-table-column label="是否必填" prop="isRequired" width="90">
+              <template slot-scope="scope">
+                <el-tag :type="scope.row.isRequired === 1 ? 'danger' : 'info'" size="mini">
+                  {{ scope.row.isRequired === 1 ? '是' : '否' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="类型" prop="fieldType" width="90">
+              <template slot-scope="scope">
+                {{ getFieldTypeLabel(scope.row.fieldType) }}
+              </template>
+            </el-table-column>
+            <el-table-column label="选项内容" prop="fieldOption" min-width="140" show-overflow-tooltip />
+            <el-table-column label="排序" prop="sort" width="70" />
+            <el-table-column label="状态" prop="status" width="90">
+              <template slot-scope="scope">
+                <el-tag :type="scope.row.status === 1 ? 'success' : 'info'" size="mini">
+                  {{ scope.row.status === 1 ? '启用' : '停用' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="80">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="deleteFieldRow(scope.$index)"
+                  v-if="fieldList.length > 0"
+                >删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 新增选项对话框 -->
+    <el-dialog title="新增选项" :visible.sync="fieldOpen" width="520px" append-to-body :close-on-click-modal="false">
+      <el-form ref="fieldForm" :model="fieldForm" :rules="fieldRules" label-width="90px">
+        <el-form-item label="选项名称" prop="fieldName">
+          <el-input v-model="fieldForm.fieldName" placeholder="请输入选项名称" />
+        </el-form-item>
+        <el-form-item label="是否必填" prop="isRequired">
+          <el-switch v-model="fieldForm.isRequired" :active-value="1" :inactive-value="0" />
+        </el-form-item>
+        <el-form-item label="类型" prop="fieldType">
+          <el-select v-model="fieldForm.fieldType" placeholder="请选择类型" style="width: 100%;" @change="handleFieldTypeChange">
+            <el-option
+              v-for="item in fieldTypeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          v-if="fieldForm.fieldType === 'radio' || fieldForm.fieldType === 'checkbox'"
+          label="选项内容"
+          prop="fieldOption"
+        >
+          <el-input
+            v-model="fieldForm.fieldOption"
+            type="textarea"
+            :rows="2"
+            placeholder="多个选项请用分号分隔,例如:选项A;选项B;选项C"
+          />
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+          <el-input-number v-model="fieldForm.sort" :min="0" controls-position="right" style="width: 100%;" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="fieldForm.status">
+            <el-radio :label="1">启用</el-radio>
+            <el-radio :label="0">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFieldForm">确 定</el-button>
+        <el-button @click="fieldOpen = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listFsStoreProductUserTemp,
+  getFsStoreProductUserTemp,
+  delFsStoreProductUserTemp,
+  addFsStoreProductUserTemp,
+  updateFsStoreProductUserTemp
+} from '@/api/hisStore/storeProductUserTemp'
+import { listFsStoreProductUserTempField } from '@/api/hisStore/storeProductUserTempField'
+
+export default {
+  name: 'FsStoreProductUserTemp',
+  data() {
+    const validateFieldOption = (rule, value, callback) => {
+      const type = this.fieldForm.fieldType
+      if ((type === 'radio' || type === 'checkbox') && !value) {
+        callback(new Error('请填写选项内容,多个选项用分号分隔'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      loading: true,
+      ids: [],
+      single: true,
+      multiple: true,
+      showSearch: true,
+      total: 0,
+      FsStoreProductUserTempList: [],
+      title: '',
+      open: false,
+      fieldOpen: false,
+      fieldList: [],
+      statusOptions: [],
+      fieldTypeOptions: [
+        { label: '文本', value: 'text' },
+        { label: '单选', value: 'radio' },
+        { label: '复选', value: 'checkbox' }
+      ],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        sort: null,
+        status: null,
+        remark: null
+      },
+      form: {},
+      fieldForm: {},
+      rules: {
+        name: [{ required: true, message: '模板标题不能为空', trigger: 'blur' }],
+        sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }]
+      },
+      fieldRules: {
+        fieldName: [{ required: true, message: '选项名称不能为空', trigger: 'blur' }],
+        fieldType: [{ required: true, message: '请选择类型', trigger: 'change' }],
+        sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
+        fieldOption: [{ validator: validateFieldOption, trigger: 'blur' }]
+      }
+    }
+  },
+  created() {
+    this.getList()
+    this.getDicts('sys_company_status').then(response => {
+      this.statusOptions = response.data
+    })
+  },
+  methods: {
+    getFieldTypeLabel(value) {
+      const item = this.fieldTypeOptions.find(opt => opt.value === value)
+      return item ? item.label : value
+    },
+    getList() {
+      this.loading = true
+      listFsStoreProductUserTemp(this.queryParams).then(response => {
+        this.FsStoreProductUserTempList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    loadFieldList(tempId) {
+      if (!tempId) {
+        this.fieldList = []
+        return Promise.resolve()
+      }
+      return listFsStoreProductUserTempField({
+        tempId,
+        pageNum: 1,
+        pageSize: 1000
+      }).then(response => {
+        this.fieldList = (response.rows || []).map(item => ({
+          fieldName: item.fieldName,
+          isRequired: item.isRequired != null ? Number(item.isRequired) : 0,
+          fieldType: item.fieldType,
+          fieldOption: item.fieldOption || '',
+          sort: item.sort != null ? Number(item.sort) : 0,
+          status: item.status != null ? Number(item.status) : 1
+        }))
+      })
+    },
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        sort: 0,
+        status: 1,
+        remark: null
+      }
+      this.fieldList = []
+      this.resetForm('form')
+    },
+    resetFieldForm() {
+      this.fieldForm = {
+        fieldName: null,
+        isRequired: 0,
+        fieldType: 'text',
+        fieldOption: '',
+        sort: 0,
+        status: 1
+      }
+      this.resetForm('fieldForm')
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加商品信息采集模板'
+    },
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id || this.ids
+      getFsStoreProductUserTemp(id).then(response => {
+        this.form = response.data
+        this.form.status = this.form.status != null ? Number(this.form.status) : 1
+        this.form.sort = this.form.sort != null ? Number(this.form.sort) : 0
+        if (response.data.fieldList && response.data.fieldList.length) {
+          this.fieldList = response.data.fieldList
+        } else {
+          return this.loadFieldList(id)
+        }
+      }).then(() => {
+        this.open = true
+        this.title = '修改商品信息采集模板'
+      })
+    },
+    openFieldDialog() {
+      this.resetFieldForm()
+      this.fieldOpen = true
+    },
+    handleFieldTypeChange() {
+      if (this.fieldForm.fieldType === 'text') {
+        this.fieldForm.fieldOption = ''
+      }
+    },
+    submitFieldForm() {
+      this.$refs.fieldForm.validate(valid => {
+        if (valid) {
+          this.fieldList.push({ ...this.fieldForm })
+          this.fieldList.sort((a, b) => a.sort - b.sort)
+          this.fieldOpen = false
+        }
+      })
+    },
+    deleteFieldRow(index) {
+      this.fieldList.splice(index, 1)
+    },
+    submitForm() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          if (this.fieldList.length === 0) {
+            this.$message.warning('请至少添加一个选项')
+            return
+          }
+          const params = {
+            ...this.form,
+            fieldList: this.fieldList
+          }
+          const request = params.id != null
+            ? updateFsStoreProductUserTemp(params)
+            : addFsStoreProductUserTemp(params)
+          request.then(response => {
+            if (response.code === 200) {
+              this.msgSuccess(params.id != null ? '修改成功' : '新增成功')
+              this.open = false
+              this.getList()
+            }
+          })
+        }
+      })
+    },
+    handleDelete(row) {
+      const ids = row.id || this.ids
+      this.$confirm('是否确认删除商品信息采集模板编号为"' + ids + '"的数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        return delFsStoreProductUserTemp(ids)
+      }).then(() => {
+        this.getList()
+        this.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>