VendorModal.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <template>
  2. <div ref="container">
  3. <a-modal
  4. :title="title"
  5. :width="1200"
  6. :visible="visible"
  7. :confirmLoading="confirmLoading"
  8. :getContainer="() => $refs.container"
  9. :maskStyle="{ top: '93px', left: '154px' }"
  10. :wrapClassName="wrapClassNameInfo()"
  11. :mask="isDesktop()"
  12. :maskClosable="false"
  13. @ok="handleOk"
  14. @cancel="handleCancel"
  15. cancelText="取消"
  16. okText="保存"
  17. style="top: 0; height: 95%"
  18. >
  19. <template slot="footer">
  20. <a-button key="back" v-if="isReadOnly" @click="handleCancel"> 取消 </a-button>
  21. </template>
  22. <a-spin :spinning="confirmLoading">
  23. <a-form :form="form" id="vendorModal">
  24. <a-row class="form-row" :gutter="24">
  25. <a-col :span="24 / 2">
  26. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商编码">
  27. <a-input placeholder="自动生成" v-decorator.trim="['serialNo']" disabled />
  28. </a-form-item>
  29. </a-col>
  30. <a-col :span="24 / 2">
  31. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="名称">
  32. <a-input placeholder="请输入名称" v-decorator.trim="['supplier', validatorRules.supplier]" />
  33. </a-form-item>
  34. </a-col>
  35. <a-col :span="24 / 2">
  36. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="联系人">
  37. <a-input placeholder="请输入联系人" v-decorator.trim="['contacts']" />
  38. </a-form-item>
  39. </a-col>
  40. <a-col :span="24 / 2">
  41. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="手机号码">
  42. <a-input placeholder="请输入手机号码" v-decorator.trim="['telephone']" />
  43. </a-form-item>
  44. </a-col>
  45. <a-col :span="24 / 2">
  46. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="联系电话">
  47. <a-input placeholder="请输入联系电话" v-decorator.trim="['phoneNum']" />
  48. </a-form-item>
  49. </a-col>
  50. <a-col :span="24 / 2">
  51. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="纳税人识别号">
  52. <a-input placeholder="请输入纳税人识别号" v-decorator.trim="['taxNum']" />
  53. </a-form-item>
  54. </a-col>
  55. <a-col :span="24 / 2">
  56. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="开户行">
  57. <a-input placeholder="请输入开户行" v-decorator.trim="['bankName']" />
  58. </a-form-item>
  59. </a-col>
  60. <a-col :span="24 / 2">
  61. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="账号">
  62. <a-input placeholder="请输入账号" v-decorator.trim="['accountNumber']" />
  63. </a-form-item>
  64. </a-col>
  65. <a-col :span="24 / 2">
  66. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="地址">
  67. <a-input placeholder="请输入地址" v-decorator.trim="['address']" />
  68. </a-form-item>
  69. </a-col>
  70. <a-col :span="24 / 2">
  71. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="排序">
  72. <a-input
  73. placeholder="请输入排序"
  74. oninput="value=value.replace(/[^\d]/g, '')"
  75. v-decorator.trim="['sort']"
  76. />
  77. </a-form-item>
  78. </a-col>
  79. <a-col :span="24 / 2">
  80. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商分级">
  81. <a-input placeholder="请输入供应商分级" v-decorator.trim="['supplierLevel']" />
  82. </a-form-item>
  83. </a-col>
  84. <a-col :span="24 / 2">
  85. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="结算周期">
  86. <a-select
  87. v-decorator.trim="['settlementMethod']"
  88. :options="settleOptions"
  89. placeholder="请选择结算周期"
  90. ></a-select>
  91. </a-form-item>
  92. </a-col>
  93. <a-col :span="24 / 2">
  94. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="付款方式">
  95. <a-select
  96. v-decorator.trim="['billingCycleDays']"
  97. placeholder="请选择付款方式"
  98. >
  99. <a-select-option value="先款后货">先款后货</a-select-option>
  100. <a-select-option value="先货后款">先货后款</a-select-option>
  101. </a-select>
  102. </a-form-item>
  103. </a-col>
  104. <a-col :span="24 / 2">
  105. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="采购对接人">
  106. <a-input placeholder="请输入采购对接人" v-decorator.trim="['procurementContact']" />
  107. </a-form-item>
  108. </a-col>
  109. <a-col :span="24 / 2">
  110. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="到货天数">
  111. <a-input
  112. placeholder="请输入到货天数"
  113. oninput="value=value.replace(/[^\d]/g, '')"
  114. v-decorator.trim="['deliveryDays']"
  115. />
  116. </a-form-item>
  117. </a-col>
  118. <a-col :span="24 / 2">
  119. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="开具发票情况">
  120. <a-select
  121. v-decorator.trim="['invoiceType']"
  122. :options="invoiceOptions"
  123. placeholder="请选择发票类型"
  124. ></a-select>
  125. </a-form-item>
  126. </a-col>
  127. <a-col :span="24 / 2">
  128. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="税率(%)">
  129. <a-input-number
  130. style="width: 100%"
  131. oninput="value=value.replace(/[^\d.]/g, '')"
  132. placeholder="请输入税率"
  133. v-decorator.trim="['taxRate']"
  134. />
  135. </a-form-item>
  136. </a-col>
  137. <a-col :span="24 / 2">
  138. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="是否支持售后">
  139. <a-select
  140. v-decorator.trim="['isAfterSales']"
  141. placeholder="请选择是否支持售后"
  142. >
  143. <a-select-option value="1">是</a-select-option>
  144. <a-select-option value="0">否</a-select-option>
  145. </a-select>
  146. </a-form-item>
  147. </a-col>
  148. <a-col :span="24 / 2">
  149. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="售后规则">
  150. <a-textarea :rows="2" placeholder="请输入售后规则" v-decorator.trim="['afterSalesRules']" />
  151. </a-form-item>
  152. </a-col>
  153. <a-col :span="24 / 2">
  154. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="备注">
  155. <a-textarea :rows="2" placeholder="请输入备注" v-decorator.trim="['description']" />
  156. </a-form-item>
  157. </a-col>
  158. <a-col :span="24 / 2">
  159. <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="合同附件">
  160. <j-upload v-decorator.trim="['contractUpload']" bizPath="bill"></j-upload>
  161. </a-form-item>
  162. </a-col>
  163. </a-row>
  164. </a-form>
  165. </a-spin>
  166. </a-modal>
  167. </div>
  168. </template>
  169. <script>
  170. import pick from 'lodash.pick'
  171. import { addSupplier, editSupplier, checkSupplier } from '@/api/api'
  172. import { autoJumpNextInput } from '@/utils/util'
  173. import { mixinDevice } from '@/utils/mixin'
  174. import JUpload from '@/components/jeecg/JUpload'
  175. export default {
  176. components: { JUpload },
  177. name: 'VendorModal',
  178. mixins: [mixinDevice],
  179. data() {
  180. return {
  181. model: {},
  182. title: '操作',
  183. visible: false,
  184. model: {},
  185. isReadOnly: false,
  186. labelCol: {
  187. xs: { span: 24 },
  188. sm: { span: 4 },
  189. },
  190. wrapperCol: {
  191. xs: { span: 24 },
  192. sm: { span: 20 },
  193. },
  194. confirmLoading: false,
  195. form: this.$form.createForm(this),
  196. validatorRules: {
  197. supplier: {
  198. rules: [
  199. { required: true, message: '请输入名称!' },
  200. { min: 2, max: 60, message: '长度在 2 到 60 个字符', trigger: 'blur' },
  201. { validator: this.validateSupplierName },
  202. ],
  203. },
  204. },
  205. settleOptions: [
  206. {
  207. value: '0',
  208. label: '周结',
  209. },
  210. {
  211. value: '1',
  212. label: '现结/按单',
  213. },
  214. {
  215. value: '2',
  216. label: '预付款',
  217. },
  218. {
  219. value: '3',
  220. label: '月结',
  221. },
  222. ],
  223. invoiceOptions: [
  224. {
  225. value: '1',
  226. label: '增值税专用发票',
  227. },
  228. {
  229. value: '0',
  230. label: '普通发票',
  231. },
  232. ],
  233. }
  234. },
  235. created() {},
  236. methods: {
  237. add() {
  238. this.edit({})
  239. },
  240. edit(record) {
  241. this.form.resetFields()
  242. this.model = Object.assign({}, record)
  243. this.visible = true
  244. this.$nextTick(() => {
  245. this.form.setFieldsValue(
  246. pick(
  247. this.model,
  248. 'supplier',
  249. 'contacts',
  250. 'telephone',
  251. 'email',
  252. 'phoneNum',
  253. 'fax',
  254. 'beginNeedPay',
  255. 'allNeedPay',
  256. 'taxNum',
  257. 'taxRate',
  258. 'bankName',
  259. 'accountNumber',
  260. 'address',
  261. 'sort',
  262. 'description',
  263. 'supplierLevel',
  264. 'settlementMethod',
  265. 'billingCycleDays',
  266. 'procurementContact',
  267. 'deliveryDays',
  268. 'invoiceType',
  269. 'contractUpload',
  270. 'serialNo',
  271. 'isAfterSales',
  272. 'afterSalesRules',
  273. )
  274. )
  275. autoJumpNextInput('vendorModal')
  276. })
  277. },
  278. close() {
  279. this.$emit('close')
  280. this.visible = false
  281. },
  282. handleOk() {
  283. const that = this
  284. // 触发表单验证
  285. this.form.validateFields((err, values) => {
  286. if (!err) {
  287. that.confirmLoading = true
  288. let formData = Object.assign(this.model, values)
  289. formData.type = '供应商'
  290. let obj
  291. if (!this.model.id) {
  292. obj = addSupplier(formData)
  293. } else {
  294. obj = editSupplier(formData)
  295. }
  296. obj
  297. .then((res) => {
  298. if (res.code === 200) {
  299. that.$emit('ok')
  300. } else {
  301. that.$message.warning(res.data.message)
  302. }
  303. })
  304. .finally(() => {
  305. that.confirmLoading = false
  306. that.close()
  307. })
  308. }
  309. })
  310. },
  311. handleCancel() {
  312. this.close()
  313. },
  314. validateSupplierName(rule, value, callback) {
  315. let params = {
  316. name: value,
  317. type: '供应商',
  318. id: this.model.id ? this.model.id : 0,
  319. }
  320. checkSupplier(params).then((res) => {
  321. if (res && res.code === 200) {
  322. if (!res.data.status) {
  323. callback()
  324. } else {
  325. callback('名称已经存在')
  326. }
  327. } else {
  328. callback(res.data)
  329. }
  330. })
  331. },
  332. },
  333. }
  334. </script>
  335. <style scoped></style>