Create.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="dialogVisible"
  5. width="750px"
  6. :append-to-body="true"
  7. :before-close="close"
  8. :destroy-on-close="true"
  9. :close-on-click-modal="false"
  10. >
  11. <el-form
  12. ref="form"
  13. :model="form"
  14. :rules="rules"
  15. label-width="120px"
  16. label-position="top"
  17. style="max-height: 375px;overflow: auto;"
  18. >
  19. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  20. <el-form-item label="门店名称" prop="colAddress" style="width: 50%;">
  21. <el-input v-model="form.name" placeholder="请输入门店名称" />
  22. </el-form-item>
  23. <el-form-item label="手机号码" prop="mobile" style="width: 50%;">
  24. <el-input v-model="form.mobile" placeholder="请输入采集器编号"/>
  25. </el-form-item>
  26. </flexbox>
  27. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  28. <el-form-item label="上级渠道" prop="parentId" style="width: 50%;">
  29. <el-select
  30. v-model="form.parentId"
  31. placeholder="请选择上级渠道"
  32. style="width: 100%;"
  33. filterable
  34. clearable
  35. >
  36. <el-option
  37. v-for="(item, index) in channelList"
  38. :key="index"
  39. :label="item.name"
  40. :value="item.channelId"
  41. />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="联系人" prop="contact" style="width: 50%;">
  45. <el-input v-model="form.contact" placeholder="请输入联系人" />
  46. </el-form-item>
  47. </flexbox>
  48. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  49. <el-form-item label="佣金比例" prop="commRate" style="width: 50%;">
  50. <el-input v-model="form.commRate" placeholder="请输入佣金比例" />
  51. </el-form-item>
  52. <el-form-item label="门店类型" prop="siteType" style="width: 50%;">
  53. <el-select
  54. v-model="form.siteType"
  55. placeholder="请选择门店类型"
  56. style="width: 100%;"
  57. filterable
  58. clearable
  59. >
  60. <el-option
  61. v-for="(item, index) in typeOptions"
  62. :key="index"
  63. :label="item.desc"
  64. :value="item.typeId"
  65. />
  66. </el-select>
  67. </el-form-item>
  68. </flexbox>
  69. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  70. <el-form-item label="门店名称" prop="siteName" style="width: 100%;">
  71. <el-input v-model="form.siteName" placeholder="例如xxxx店, 对用户可见" />
  72. </el-form-item>
  73. </flexbox>
  74. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  75. <el-form-item label="省" prop="provinceId" style="width: 30%;">
  76. <el-select
  77. v-model="form.provinceId"
  78. placeholder="选择省份"
  79. clearable
  80. size="small"
  81. @change="getCityList()"
  82. style="width: 100%;margin-right: 1px;">
  83. <el-option
  84. v-for="item in provinceList"
  85. :key="item.areaId"
  86. :label="item.areaName"
  87. :value="item.areaId"
  88. />
  89. </el-select>
  90. </el-form-item>
  91. <el-form-item label="市" prop="cityId" style="width: 30%;">
  92. <el-select
  93. v-model="form.cityId"
  94. placeholder="选择市"
  95. clearable
  96. size="small"
  97. @change="getAreaList()"
  98. style="width: 100%;margin-right: 1px;">
  99. <el-option
  100. v-for="item in cityList"
  101. :key="item.areaId"
  102. :label="item.areaName"
  103. :value="item.areaId"
  104. />
  105. </el-select>
  106. </el-form-item>
  107. <el-form-item label="区" prop="areaId" style="width: 30%;" >
  108. <el-select v-model="form.areaId"
  109. placeholder="选择区"
  110. clearable
  111. size="small"
  112. @change="getAreaName()"
  113. style="width: 100%;margin-right: 1px;">
  114. <el-option
  115. v-for="item in areaList"
  116. :key="item.areaId"
  117. :label="item.areaName"
  118. :value="item.areaId"
  119. />
  120. </el-select>
  121. </el-form-item>
  122. </flexbox>
  123. <flexbox
  124. class="ygp-form-items"
  125. align="flex-start"
  126. justify="flex-start">
  127. <el-form-item label="详细地址" prop="adress" style="width: 100%;">
  128. <el-input v-model="form.adress" placeholder="请输入详细地址" />
  129. </el-form-item>
  130. </flexbox>
  131. <flexbox
  132. class="ygp-form-items"
  133. align="flex-start"
  134. justify="flex-start">
  135. <el-form-item label="营业执照" prop="bizLicensePic" style="width: 50%;">
  136. <image-upload
  137. :limit="1"
  138. :value="form.bizLicensePic"
  139. :file-size="50"
  140. :is-public="false"
  141. :show-file-list="true"
  142. @input="bizLicensePicSelect"
  143. />
  144. </el-form-item>
  145. <el-form-item label="门头照片" prop="doorPic" style="width: 50%;">
  146. <image-upload
  147. :limit="1"
  148. :value="form.doorPic"
  149. :file-size="50"
  150. :is-public="true"
  151. :show-file-list="true"
  152. @input="doorPicSelect"
  153. />
  154. </el-form-item>
  155. </flexbox>
  156. <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
  157. <el-form-item label="信息状态" prop="certifyStatus" style="width: 50%;">
  158. <el-checkbox v-model="form.certifyStatus">已补充</el-checkbox>
  159. </el-form-item>
  160. </flexbox>
  161. </el-form>
  162. <div slot="footer" class="dialog-footer">
  163. <el-button @click="close">取 消</el-button>
  164. <el-button type="primary" :disabled="loading" @click="saveClick">确 定</el-button>
  165. </div>
  166. </el-dialog>
  167. </template>
  168. <script>
  169. import { addSaleSite, updateSaleSite, getSaleSiteDetail} from "@/api/admin/salesite";
  170. import { listAllChannel} from "@/api/admin/channel";
  171. import { listAreaByPid} from "@/api/admin/area";
  172. import { mapGetters } from "vuex";
  173. export default {
  174. props: {
  175. dialogVisible: {
  176. type: Boolean,
  177. default: false
  178. },
  179. editId: [Number, String] // 编辑用
  180. },
  181. data() {
  182. return {
  183. IMG_URL: process.env.VUE_APP_IMG_URL,
  184. loading: false,
  185. // 上级渠道列表
  186. channelList:[],
  187. channelCopyList:[],
  188. provinceList:[],
  189. cityList:[],
  190. areaList:[],
  191. statusOptions: [],
  192. typeOptions:[],
  193. // 表单参数
  194. form: {
  195. name:"",
  196. mobile:"",
  197. contact:"",
  198. commRate:"",
  199. provinceId:"",
  200. cityId:"",
  201. areaId:"",
  202. province:"",
  203. city:"",
  204. area:""
  205. },
  206. detail: {},
  207. // 表单校验
  208. rules: {
  209. name: [
  210. { required: true, message: "请输入渠道名称", trigger: "blur" }
  211. ],
  212. mobile: [
  213. { required: true, message: "请输入手机号码", trigger: "blur" },
  214. {pattern: /^((\+?86)|(\(\+86\)))?1\d{10}$/, message: "请输入正确的手机号码", trigger: "blur" }
  215. ],
  216. parentId: [{ required: true, message: "请选择上级渠道", trigger: "change" }],
  217. contact: [
  218. { required: true, message: "请输入联系人", trigger: "blur" }
  219. ],
  220. commRate: [
  221. { required: true, message: "请输入佣金比例", trigger: "blur" },
  222. { pattern: /^(([1-9]{1}\d{0,99}))(\.\d{1,2})?$/, message: "佣金比例只能为大于0的数字", trigger:['blur', 'change'] },
  223. ],
  224. siteType: [
  225. { required: true, message: "请选择门店类型", trigger: "change" }
  226. ],
  227. siteName: [
  228. { required: true, message: "请输入门店名称", trigger: "blur" }
  229. ],
  230. provinceId: [{ required: true, message: "请选择省", trigger: "change" }],
  231. cityId: [{ required: true, message: "请选择市", trigger: "change" }],
  232. areaId: [{ required: true, message: "请选择区", trigger: "change" }],
  233. address: [
  234. { required: true, message: "请输入详细地址", trigger: "blur" }
  235. ],
  236. bizLicensePic: [
  237. { required: true, message: "请选择营业执照", trigger: "blur" }
  238. ],
  239. doorPic: [
  240. { required: true, message: "请选择门头照片", trigger: "blur" }
  241. ],
  242. },
  243. //招商推广宣传图
  244. picture: []
  245. };
  246. },
  247. computed: {
  248. ...mapGetters(["userInfo"]),
  249. title() {
  250. return this.editId ? "编辑门店" : "添加门店";
  251. }
  252. },
  253. created() {
  254. //this.getCustItems();
  255. // this.getTypeItems();
  256. //console.log("watch dialogVisible created == ");
  257. // 是编辑
  258. if (this.editId) {
  259. this.getDetail();
  260. }else{
  261. this.getProvinceList()
  262. }
  263. this.getChannelList()
  264. },
  265. mounted() {
  266. document.body.appendChild(this.$el);
  267. },
  268. destroyed() {
  269. // if appendToBody is true, remove DOM node after destroy
  270. if (this.appendToBody && this.$el && this.$el.parentNode) {
  271. this.$el.parentNode.removeChild(this.$el);
  272. }
  273. },
  274. methods: {
  275. // 获取上级渠道下拉列表
  276. getChannelList(){
  277. listAllChannel().then(response => {
  278. // console.log("getChannelList == "+ JSON.stringify(response.data))
  279. this.channelList = this.channelList.concat(response.data || []);
  280. this.channelCopyList = this.channelList;
  281. });
  282. },
  283. // 添加营业执照
  284. bizLicensePicSelect(data) {
  285. this.form.bizLicensePic = data
  286. console.log("bizLicensePicSelect 添加营业执照 data = "+JSON.stringify(data))
  287. },
  288. // 添加门头照片
  289. doorPicSelect(data) {
  290. this.form.doorPic = data
  291. console.log("doorPicSelect 添加门头照片 data = "+JSON.stringify(data))
  292. },
  293. // 省
  294. getProvinceList(){
  295. this.cityList = []
  296. this.areaList = []
  297. this.form.cityId = ""
  298. this.form.city = ""
  299. this.form.areaId = ""
  300. this.form.area = ""
  301. listAreaByPid(0).then(response => {
  302. // console.log("getProvinceList"+JSON.stringify(response))
  303. console.log("getProvinceList this.form=="+JSON.stringify(this.form))
  304. this.provinceList = response || [];
  305. console.log("this.editId && this.form.provinceId == "+(this.editId && this.form.provinceId))
  306. if(this.editId && this.detail.provinceId){
  307. this.form.provinceId = this.detail.provinceId
  308. this.getCityList()
  309. }
  310. });
  311. },
  312. getProvinceName(){
  313. let val = this.form.provinceId
  314. if(val){
  315. let nameObj = this.provinceList.find(item => {
  316. return item.areaId == val;
  317. })
  318. return nameObj && nameObj.areaName
  319. }
  320. return ""
  321. },
  322. getCityList(){
  323. this.cityList = []
  324. this.areaList = []
  325. this.form.cityId = ""
  326. this.form.city = ""
  327. this.form.areaId = ""
  328. this.form.area = ""
  329. var provinceId = this.form.provinceId
  330. this.form.province = this.getProvinceName()
  331. listAreaByPid(provinceId).then(response => {
  332. this.cityList = response || [];
  333. if(this.editId && this.detail.cityId){
  334. this.form.cityId = this.detail.cityId
  335. this.getAreaList()
  336. }
  337. });
  338. },
  339. getCityName(){
  340. let val = this.form.cityId
  341. if(val){
  342. let nameObj = this.cityList.find(item => {
  343. return item.areaId == val;
  344. })
  345. return nameObj && nameObj.areaName
  346. }
  347. return ""
  348. },
  349. getAreaList(){
  350. var cityId = this.form.cityId
  351. this.form.city = this.getCityName();
  352. listAreaByPid(cityId).then(response => {
  353. // console.log("getAreaList"+JSON.stringify(response))
  354. this.areaList = response || [];
  355. if(this.editId && this.detail.areaId){
  356. this.form.areaId = this.detail.areaId
  357. }
  358. });
  359. },
  360. getAreaName(){
  361. let val = this.form.areaId
  362. if(val){
  363. let nameObj = this.areaList.find(item => {
  364. return item.areaId == val;
  365. })
  366. this.form.area = nameObj && nameObj.areaName
  367. }else{
  368. this.form.area = "";
  369. }
  370. },
  371. dataFilter(val) {
  372. this.value = val;
  373. if (val) { //val存在
  374. this.channelList = this.channelCopyList.filter((item) => {
  375. // console.log("dataFilter item"+JSON.stringify(item))
  376. if (!!~item.mobile.indexOf(val) || !!~item.mobile.toUpperCase().indexOf(val.toUpperCase())) {
  377. return true
  378. }
  379. })
  380. } else { //val为空时,还原数组
  381. this.channelList = this.channelCopyList;
  382. }
  383. },
  384. /**
  385. * 获取项目详情
  386. */
  387. getDetail() {
  388. this.loading = true;
  389. getSaleSiteDetail(this.editId).then(res => {
  390. const data = res.data || {}
  391. // console.log("getDetail :" + JSON.stringify(data))
  392. this.detail = data
  393. this.form.name = data.name
  394. this.form.mobile = data.mobile
  395. this.form.contact = data.contact
  396. this.form.commRate = data.commRate
  397. this.loading = false
  398. this.getProvinceList()
  399. })
  400. .catch(() => {
  401. this.loading = false;
  402. });
  403. },
  404. saveClick(){
  405. // console.log("saveClick tthis.form = "+JSON.stringify(this.form))
  406. this.loading = true
  407. const subForm = this.$refs["form"]
  408. subForm.validate(valid => {
  409. if (valid) {
  410. this.submitForm(this.form);
  411. } else {
  412. this.loading = false;
  413. // 提示第一个error
  414. this.getFormErrorMessage(subForm);
  415. return false;
  416. }
  417. });
  418. },
  419. /**
  420. * 保存
  421. */
  422. submitForm(params) {
  423. // console.log("submitForm =============")
  424. if (this.editId) {
  425. params.channelId = this.editId;
  426. }
  427. const request = this.editId ? updateSaleSite : addSaleSite
  428. // console.log("submitForm params = "+ JSON.stringify(params))
  429. request(params).then(response => {
  430. this.loading = false
  431. if(this.editId){
  432. this.$message.success('更新成功')
  433. }else{
  434. this.$message.success('新增成功')
  435. }
  436. this.$emit('saveSuccess')
  437. this.close()
  438. }).catch(() => {
  439. this.loading = false
  440. });
  441. },
  442. /**
  443. * 关闭窗口
  444. */
  445. close() {
  446. this.$emit("close");
  447. this.form = {
  448. month: 3,
  449. packageType: "1"
  450. };
  451. }
  452. }
  453. };
  454. </script>
  455. <style scoped lang="scss">
  456. .tag {
  457. margin-right: 15px;
  458. width: 90px;
  459. text-align: center;
  460. cursor: pointer;
  461. }
  462. .tag-select {
  463. background-color: #409eff !important;
  464. border-color: #409eff !important;
  465. color: #fff !important;
  466. }
  467. .cover-content-item {
  468. width: 220px;
  469. float: left;
  470. position: relative;
  471. .cover-img {
  472. width: 200px;
  473. height: 100px;
  474. }
  475. .cover-mark {
  476. position: absolute;
  477. top: 0px;
  478. right: 28px;
  479. z-index: 1;
  480. color: red;
  481. cursor: pointer;
  482. visibility: hidden;
  483. }
  484. .select {
  485. visibility: visible !important;
  486. }
  487. }
  488. .dialog-footer {
  489. text-align: center;
  490. }
  491. </style>
  492. <style lang="scss">
  493. .ygp-form-items {
  494. .el-form-item {
  495. padding: 0 5px;
  496. }
  497. .el-form-item__label {
  498. line-height: 1.2;
  499. padding-bottom: 8px;
  500. word-break: break-all;
  501. word-wrap: break-word;
  502. color: #333;
  503. }
  504. .el-form-item__error {
  505. position: relative;
  506. top: auto;
  507. left: auto;
  508. }
  509. .el-form-item.is-desc_text {
  510. .el-form-item__label {
  511. display: none;
  512. }
  513. }
  514. }
  515. </style>