addAndEdit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <!--
  2. * @Description: 新增/编辑弹框
  3. * @Author: Sugar.
  4. * @Date: 2023-11-24 13:55:00
  5. * @LastEditors: Sugar.
  6. * @LastEditTime: 2023-11-24 13:55:00
  7. * @FilePath: \cattle_webui\src\views\venue\schedulingMr\dialog\AddOrEditDialog.vue
  8. * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
  9. -->
  10. <template>
  11. <el-dialog
  12. :title="title"
  13. :visible.sync="open"
  14. width="70%"
  15. class="text-dia-log-class"
  16. append-to-body
  17. :close-on-click-modal="false"
  18. @close="cancel"
  19. >
  20. <div class="dialog">
  21. <el-form :model="form" ref="form" :rules="rules" label-width="140px">
  22. <el-form-item label="票务名称:" prop="goodsId">
  23. <el-select
  24. v-model="form.goodsId"
  25. placeholder="票务名称"
  26. clearable
  27. style="width: 350px"
  28. @change="selectGoodsId"
  29. >
  30. <el-option
  31. v-for="dict in goodsPageListS"
  32. :key="dict.id"
  33. :value="dict.id"
  34. :label="dict.status == 1 ? dict.goodsName + '(被禁用)': dict.goodsName"
  35. :disabled="dict.status != 0"
  36. >
  37. </el-option>
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item label="票档名称:" prop="seatTypeId">
  41. <el-select
  42. v-model="form.seatTypeId"
  43. placeholder="票档名称"
  44. clearable
  45. style="width: 350px"
  46. >
  47. <el-option
  48. v-for="dict in seatTypeListS"
  49. :key="dict.seatTypeId"
  50. :value="dict.seatTypeId"
  51. :label="dict.seatTypeName"
  52. >
  53. </el-option>
  54. </el-select>
  55. </el-form-item>
  56. <el-form-item label="日期范围:" v-if="!['group'].includes(channelType)" prop="performDate">
  57. <el-date-picker
  58. v-model="form.performDate"
  59. type="daterange"
  60. range-separator="至"
  61. value-format="yyyy-MM-dd"
  62. start-placeholder="开始日期"
  63. end-placeholder="结束日期">
  64. </el-date-picker>
  65. </el-form-item>
  66. <el-form-item label="星期:" v-if="!['group'].includes(channelType)" prop="weekType">
  67. <div>
  68. <el-button
  69. @click="selectWeekType()"
  70. :type="form.weekType == 1 ?'':'primary'">不限</el-button>
  71. <el-button
  72. v-for="(item,index) in weekDayList"
  73. :key="index"
  74. @click="selectWeekDay(item)"
  75. :type="form.weekName.includes(item.key)?'primary':''">{{ item.name }}</el-button>
  76. </div>
  77. <div style="font-size: 12px;">指定在选定区间内的周几价格进行调整,列如区间选择2018-01-01至2018-01-20,星期选择星期一,则这个区间内的星期一价格都进行调整</div>
  78. </el-form-item>
  79. <div v-if="['group'].includes(channelType)">
  80. <el-form-item label="成团要求:" prop="touristLimit">
  81. <el-radio-group v-model="form.touristLimit" @input="selectTouristLimit">
  82. <!-- <el-radio :label="0">不限</el-radio> -->
  83. <el-radio :label="1">限制最低人数</el-radio>
  84. <el-radio :label="2">限制人数范围</el-radio>
  85. </el-radio-group>
  86. </el-form-item>
  87. <el-form-item v-if="form.touristLimit == 1 || form.touristLimit == 2" label="游客限制最小值:" prop="touristMin">
  88. <el-input-number v-model="form.touristMin" :step="1" :precision="0" style="width: 350px"></el-input-number>
  89. </el-form-item>
  90. <el-form-item v-if="form.touristLimit == 2" label="游客限制最大值:" prop="touristMax">
  91. <el-input-number v-model="form.touristMax" :step="1" :precision="0" style="width: 350px"></el-input-number>
  92. </el-form-item>
  93. </div>
  94. <el-form-item v-if="!['window','group'].includes(channelType)" label="划线价:" prop="originalAmount">
  95. <el-input-number v-model="form.originalAmount" style="width: 350px"></el-input-number>
  96. </el-form-item>
  97. <el-form-item :label="setSaleAmounttile()" prop="saleAmount">
  98. <el-input-number v-model="form.saleAmount" style="width: 350px"></el-input-number>
  99. {{ !['group'].includes(channelType) ? '元':form.touristLimit==2?'元':'元/人' }}
  100. </el-form-item>
  101. <el-form-item v-if="channelType == 'retail'" label="佣金:" prop="retailAmount">
  102. <el-input-number v-model="form.retailAmount" style="width: 350px"></el-input-number>
  103. </el-form-item>
  104. <el-form-item label="备注:" prop="remark">
  105. <el-input v-model="form.remark" type="textarea" maxlength="50" show-word-limit></el-input>
  106. </el-form-item>
  107. </el-form>
  108. </div>
  109. <span slot="footer" class="dialog-footer">
  110. <el-button @click="cancel">取消</el-button>
  111. <el-button
  112. type="primary"
  113. @click="submitForm"
  114. v-loading.fullscreen.lock="loading"
  115. element-loading-text="提交中..."
  116. element-loading-spinner="el-icon-loading"
  117. element-loading-background="rgba(0, 0, 0, 0.8)"
  118. >
  119. <span v-if="loading">提交中...</span>
  120. <span v-else>保存</span>
  121. </el-button>
  122. </span>
  123. </el-dialog>
  124. </template>
  125. <script>
  126. import { saveAndEdit } from "@/api/priceConfiguration/index";
  127. import { pageList as goodsPageListApi } from '@/api/ticketMr/ticketMr'
  128. import moment from "moment"
  129. export default {
  130. name: "addAndEdit",
  131. props: {
  132. channelType: {
  133. type: [String]
  134. }
  135. },
  136. data() {
  137. return {
  138. title: "编辑",
  139. model: "EDIT",
  140. open: false,
  141. loading: false,
  142. tableType: false,
  143. form: {
  144. id: undefined,
  145. weekName: [],
  146. weekType: 0,
  147. },
  148. rules: {
  149. performDate: [{ required: true, message: "请选择日期", trigger: ["change","blur"] }],
  150. goodsId: [{ required: true, message: "请选择票务", trigger: ["change","blur"] }],
  151. weekType: [{ required: true, message: "请选择星期", trigger: ["change","blur"] }],
  152. seatTypeId: [{ required: true, message: "请选择票档名称", trigger: ["change","blur"] }],
  153. originalAmount: [{ required: true, message: "请输入划线价", trigger: ["change","blur"] }],
  154. saleAmount: [{ required: true, message: "请输入价格", trigger: ["change","blur"] }],
  155. retailAmount: [{ required: true, message: "请输入佣金", trigger: ["change","blur"] }],
  156. remark: [{ required: false, message: "请输入备注", trigger: ["change","blur"] }],
  157. touristLimit: [{ required: true, message: "请选择成团要求", trigger: ["change","blur"] }],
  158. touristMin: [{ required: true, message: "请输入游客限制最小值", trigger: ["change","blur"] }],
  159. touristMax: [{ required: true, message: "请输入游客限制最大值", trigger: ["change","blur"] }],
  160. },
  161. editType: false,
  162. goodsPageListS: [], // 票务
  163. seatTypeListS: [], // 座位类型
  164. weekDayList: [
  165. {name: "星期一",key: "星期一"},
  166. {name: "星期二",key: "星期二"},
  167. {name: "星期三",key: "星期三"},
  168. {name: "星期四",key: "星期四"},
  169. {name: "星期五",key: "星期五"},
  170. {name: "星期六",key: "星期六"},
  171. {name: "星期日",key: "星期日"},
  172. ],
  173. inventoryTemplateList: []
  174. };
  175. },
  176. created() {
  177. this.goodsPageListFun()
  178. },
  179. methods: {
  180. /**
  181. * 打开弹框
  182. * @date 2023-11-22
  183. * @param {any} obj
  184. * @returns {any}
  185. */
  186. async openDialog(title, obj, type) {
  187. this.open = true;
  188. this.editType = false;
  189. if (obj){
  190. this.title = "编辑价格配置";
  191. this.selectGoodsId(obj.goodsId)
  192. if(this.channelType == 'group') {
  193. this.form = {
  194. ...obj,
  195. }
  196. }else {
  197. this.form = {
  198. ...obj,
  199. performDate: [obj.dateStart,obj.dateEnd],
  200. goodsId: obj.goodsId ? obj.goodsId.split(','):[],
  201. weekName: obj.weekName ? obj.weekName.split(','):[],
  202. planSessionList: obj.planSessionList ? obj.planSessionList:[],
  203. id: null
  204. }
  205. }
  206. }else{
  207. this.title = "新增价格配置";
  208. if(this.channelType == 'group') {
  209. this.form = {
  210. touristLimit: 1,
  211. };
  212. }else {
  213. this.form = {
  214. weekName: [],
  215. weekType: 0,
  216. };
  217. }
  218. }
  219. this.$nextTick(() => {
  220. this.$refs["form"].clearValidate();
  221. });
  222. },
  223. // yyyy-mm-dd 转时时间戳
  224. dateToTimestamp(year, month, day) {
  225. const date = new Date(year, month - 1, day);
  226. return date.getTime();
  227. },
  228. /** 票务信息 */
  229. async goodsPageListFun(){
  230. try {
  231. let res = await goodsPageListApi({
  232. pageNum: 1,
  233. pageSize: 999,
  234. goodsType: 2,
  235. classifyId: 1,
  236. channelType: this.channelType,
  237. })
  238. if(res.code == 200){
  239. this.goodsPageListS = res.data.rows || []
  240. }
  241. } catch (error) {
  242. }
  243. },
  244. /** 选择票务 */
  245. selectGoodsId(value){
  246. this.$set(this.form,'seatTypeId','')
  247. this.goodsPageListS.forEach((item,index)=>{
  248. if(item.id == value) {
  249. this.seatTypeListS = item.seatTypeList
  250. }
  251. })
  252. },
  253. /**
  254. * 保存
  255. * @date 2023-11-22
  256. * @returns {any}
  257. */
  258. submitForm() {
  259. this.$refs["form"].validate(async (valid) => {
  260. if (valid) {
  261. try {
  262. let postEdit = JSON.parse(JSON.stringify(this.form))
  263. if(postEdit.performDate){
  264. postEdit['startDate'] = moment(postEdit.performDate[0]).format('YYYY-MM-DD')
  265. postEdit['endDate'] = moment(postEdit.performDate[1]).format('YYYY-MM-DD')
  266. }
  267. if(postEdit.weekName) {
  268. postEdit.weekName = postEdit.weekName.join(',')
  269. }
  270. if(this.channelType == 'group') {
  271. if(!postEdit.touristLimit) {
  272. postEdit.touristMin = ''
  273. postEdit.touristMax = ''
  274. }else if(postEdit.touristLimit == 1) {
  275. postEdit.touristMax = ''
  276. }
  277. }
  278. delete postEdit.performDate
  279. this.loading = true;
  280. const { code } = await saveAndEdit({ ...postEdit });
  281. if (code === 200) {
  282. this.$message.success("操作成功!");
  283. this.$emit("getList");
  284. this.cancel();
  285. }
  286. } catch (error) {
  287. console.error("error====",error)
  288. } finally {
  289. this.loading = false;
  290. }
  291. }
  292. });
  293. },
  294. /**
  295. * 重置
  296. * @date 2023-11-22
  297. * @returns {any}
  298. */
  299. reset() {
  300. },
  301. /**
  302. * 关闭弹框
  303. * @date 2023-11-22
  304. * @returns {any}
  305. */
  306. cancel() {
  307. this.reset();
  308. this.open = false;
  309. },
  310. selectWeekDay(item){
  311. let index = -1
  312. this.form.weekName.forEach((item1,index1)=>{
  313. if(item.key == item1) {
  314. index = index1
  315. }
  316. })
  317. if(index != -1) {
  318. this.form.weekName.splice(index,1)
  319. }else {
  320. this.form.weekName.push(item.key)
  321. }
  322. if(this.form.weekName.length>0) {
  323. this.form.weekType = 1
  324. }else {
  325. this.form.weekType = 0
  326. }
  327. },
  328. selectWeekType() {
  329. this.form.weekType = this.form.weekType == 1 ? 0 : 1
  330. if(!this.form.weekType) {
  331. this.form.weekName = []
  332. }
  333. },
  334. /** */
  335. setSaleAmounttile(){
  336. let str = ''
  337. if(this.channelType == "applet") {
  338. str = "销售价:"
  339. }
  340. if(this.channelType == "retail") {
  341. str = "分销价:"
  342. }
  343. if(this.channelType == "window") {
  344. str = "销售价:"
  345. }
  346. if(this.channelType == "group") {
  347. str = "销售价:"
  348. }
  349. return str
  350. },
  351. selectTouristLimit() {
  352. this.$set(this.form,'touristMin',undefined)
  353. this.$set(this.form,'touristMax',undefined)
  354. }
  355. },
  356. };
  357. </script>
  358. <style lang="scss" scoped>
  359. .dialog {
  360. height: 65vh;
  361. overflow-y: auto;
  362. }
  363. .dialog {
  364. .upload-btn {
  365. width: 100px;
  366. height: 100px;
  367. background-color: #fbfdff;
  368. border: dashed 1px #c0ccda;
  369. border-radius: 5px;
  370. i {
  371. font-size: 30px;
  372. margin-top: 20px;
  373. }
  374. &-text {
  375. margin-top: -10px;
  376. }
  377. }
  378. .avatar {
  379. cursor: pointer;
  380. }
  381. }
  382. </style>