jewelry.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <!-- 添加商品-钻石首饰 -->
  2. <template>
  3. <el-form ref="formRef" class="el-form--horizontal" label-width="130px" :model="formData" :rules="formRules">
  4. <el-form-item label="商品编号" prop="GoodsNo">
  5. <el-input placeholder="请输入" v-model="formData.GoodsNo" />
  6. </el-form-item>
  7. <el-form-item label="履约方式" prop="PerformanceTemplateID" v-if="code === 'warehousing_goods_sell'">
  8. <component :is="components.performance" v-model="performanceId" />
  9. </el-form-item>
  10. <el-form-item label="货币类型" prop="ZSCurrencyType">
  11. <el-radio-group v-model="formData.ZSCurrencyType">
  12. <el-radio :label="item.value" v-for="(item, index) in enums.currencyTypeList" :key="index">
  13. {{ item.label }}
  14. </el-radio>
  15. </el-radio-group>
  16. </el-form-item>
  17. <el-form-item :label="`价格(${currencyInfo?.enumitemvalue})`" prop="Price">
  18. <el-input-number placeholder="请输入" :min="0" :max="maxValue" :precision="2" v-model="formData.Price" />
  19. </el-form-item>
  20. <el-form-item label="主石重量(克拉)" prop="Weight">
  21. <el-input-number placeholder="请输入" :min="0" :max="maxValue" :precision="2" v-model="formData.Weight" />
  22. </el-form-item>
  23. <el-form-item label="款式" prop="ZSStyleType">
  24. <el-select v-model="formData.ZSStyleType">
  25. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.styleTypeList"
  26. :key="index" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="尺寸" prop="Size">
  30. <div class="el-form-item--col">
  31. <el-input v-model="formData.Size1" />
  32. <span>×</span>
  33. <el-input v-model="formData.Size2" />
  34. <span>×</span>
  35. <el-input v-model="formData.Size3" />
  36. </div>
  37. </el-form-item>
  38. <el-form-item label="形状" prop="ZSShapeType">
  39. <el-select v-model="shapeId" @change="shapeChange">
  40. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.shapeTypeList"
  41. :key="index" />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="切工" prop="ZSCutType1">
  45. <el-select v-model="formData.ZSCutType1" clearable>
  46. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.cutTypeList"
  47. :key="index" />
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item label="颜色" prop="ZSColorType1">
  51. <el-select v-model="formData.ZSColorType1">
  52. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.colorTypeList"
  53. :key="index" />
  54. </el-select>
  55. </el-form-item>
  56. <el-form-item label="抛光" prop="ZSPolishType1">
  57. <el-select v-model="formData.ZSPolishType1" clearable>
  58. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.polishTypeList"
  59. :key="index" />
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item label="净度" prop="ZSClarityType1">
  63. <el-select v-model="formData.ZSClarityType1">
  64. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.clarityTypeList"
  65. :key="index" />
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item label="荧光" prop="ZSFluorescenceType1">
  69. <el-select v-model="formData.ZSFluorescenceType1" clearable>
  70. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.fluorescenceTypeList"
  71. :key="index" />
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item label="对称" prop="ZSSymmetryType1">
  75. <el-select v-model="formData.ZSSymmetryType1" clearable>
  76. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.symmetryTypeList"
  77. :key="index" />
  78. </el-select>
  79. </el-form-item>
  80. <el-form-item :label="`市场价(${currencyInfo?.enumitemvalue})`" prop="MarketPrice">
  81. <el-input-number placeholder="请输入" :min="0" :max="maxValue" :precision="2" v-model="formData.MarketPrice" />
  82. </el-form-item>
  83. <el-form-item label="仓库" prop="WarehouseID">
  84. <el-select v-model="formData.WarehouseID">
  85. <el-option :label="item.warehousename" :value="item.autoid" v-for="(item, index) in warehouseList"
  86. :key="index" />
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item label="镶嵌材料" prop="SettingMaterial">
  90. <el-input placeholder="请输入" v-model="formData.SettingMaterial" />
  91. </el-form-item>
  92. <el-form-item label="证书类型" prop="ZSCertType">
  93. <el-select v-model="formData.ZSCertType" clearable>
  94. <el-option :label="item.label" :value="item.value" v-for="(item, index) in enums.certTypeList"
  95. :key="index" />
  96. </el-select>
  97. </el-form-item>
  98. <el-form-item label="证书编号" prop="CerNo">
  99. <el-input placeholder="请输入" v-model="formData.CerNo" />
  100. </el-form-item>
  101. <el-form-item label="配石描述" prop="StoneDesc">
  102. <el-input placeholder="请输入" v-model="formData.StoneDesc" />
  103. </el-form-item>
  104. <el-form-item label="商品图片" prop="ImagePath">
  105. <app-upload :file-types="['image']" type-message="请选择正确的图片类型" @change="onUploadChange" />
  106. </el-form-item>
  107. <el-form-item class="el-form-item--row" label="备注" prop="Remark">
  108. <el-input type="textarea" v-model="formData.Remark" />
  109. </el-form-item>
  110. </el-form>
  111. </template>
  112. <script lang="ts" setup>
  113. import { ref, PropType, defineAsyncComponent } from 'vue'
  114. import { ElMessage, FormInstance, FormRules } from 'element-plus'
  115. import { regular } from '@/constants/regex'
  116. import { Category } from '@/constants/diamond'
  117. import { maxValue } from '@/constants/common'
  118. import { useDiamondForm } from '@/business/goods'
  119. import AppUpload from '@pc/components/base/upload/index.vue'
  120. defineProps({
  121. code: String,
  122. selectedRow: {
  123. type: Object as PropType<Ermcp.UserRole>,
  124. default: () => ({})
  125. }
  126. })
  127. const components = {
  128. performance: defineAsyncComponent(() => import('@pc/components/modules/performance/index.vue')),
  129. }
  130. const emit = defineEmits(['cancel'])
  131. const { loading, formData, performanceId, shapeId, enums, warehouseList, currencyInfo, addOrUpdate } = useDiamondForm(Category.Jewelry)
  132. const formRef = ref<FormInstance>()
  133. const formRules: FormRules = {
  134. ZSCategory: [{ required: true, message: '请选择商品分类' }],
  135. GoodsNo: [{ required: true, message: '请输入商品编号', trigger: 'blur' }],
  136. SettingMaterial: [{ required: true, message: '请输入镶嵌材料', trigger: 'blur' }],
  137. ZSCurrencyType: [{ required: true, message: '请选择货币类型' }],
  138. ZSStyleType: [{ required: true, message: '请选择款式' }],
  139. Price: [{
  140. required: true,
  141. message: '请输入价格',
  142. pattern: regular.positive.reg
  143. }],
  144. Weight: [{
  145. required: true,
  146. message: '请输入主石重量',
  147. pattern: regular.positive.reg
  148. }],
  149. ZSColorType1: [{ required: true, message: '请选择颜色' }],
  150. ZSClarityType1: [{ required: true, message: '请选择净度' }],
  151. WarehouseID: [{ required: true, message: '请选择仓库' }],
  152. PerformanceTemplateID: [{
  153. required: true,
  154. validator: (rule, value, callback) => {
  155. if (performanceId.value) {
  156. callback()
  157. } else {
  158. callback(new Error('请选择履约方式'))
  159. }
  160. }
  161. }],
  162. ZSShapeType: [{
  163. required: true,
  164. validator: (rule, value, callback) => {
  165. if (shapeId.value) {
  166. callback()
  167. } else {
  168. callback(new Error('请选择形状'))
  169. }
  170. }
  171. }],
  172. Size: [{
  173. validator: (rule, value, callback) => {
  174. const { Size1, Size2, Size3 } = formData
  175. if ((!Size1 && !Size2 && !Size3) || (Size1 && Size2 && Size3)) {
  176. callback()
  177. } else {
  178. callback(new Error('请输入尺寸'))
  179. }
  180. }
  181. }],
  182. }
  183. // 选择形状
  184. const shapeChange = (value: number) => {
  185. if (value) {
  186. formData.ZSShapeType = [value]
  187. } else {
  188. formData.ZSShapeType = []
  189. }
  190. }
  191. const onUploadChange = (file: { filePath: string }) => {
  192. formData.ImagePath = file.filePath
  193. }
  194. const onSubmit = () => {
  195. formRef.value?.validate((valid) => {
  196. if (valid) {
  197. addOrUpdate().then(() => {
  198. ElMessage.success('提交成功')
  199. emit('cancel', true)
  200. }).catch((err) => {
  201. ElMessage.error('提交失败:' + err)
  202. })
  203. }
  204. })
  205. }
  206. // 暴露组件属性给父组件调用
  207. defineExpose({
  208. loading,
  209. submit: onSubmit
  210. })
  211. </script>