| | |
| | | @layout("/common/_container.html"){ |
| | | <div class="ibox float-e-margins"> |
| | | <div class="ibox-content"> |
| | | <div class="form-horizontal"> |
| | | <body> |
| | | <div id="app0" class="form-container"> |
| | | <el-form :rules="rules" label-position="left" ref="formRef" label-width="120px" :model="huiminCard" size="small"> |
| | | <el-form-item label="惠民卡名称" prop="huiMinName"> |
| | | <el-input v-model="huiminCard.huiMinName"></el-input> |
| | | </el-form-item> |
| | | |
| | | <div class="row"> |
| | | <div class="col-sm-6 b-r"> |
| | | <#input id="id" name="主键id" underline="true"/> |
| | | <#input id="huiMinName" name="惠民卡名称" underline="true"/> |
| | | <#input id="huiMinType" name="惠民卡类型1年度2年内" underline="true"/> |
| | | <#input id="salesMoney" name="售卖金额" underline="true"/> |
| | | <#input id="buyCover" name="已购买封面" underline="true"/> |
| | | <#input id="unBuyCover" name="未购买封面" underline="true"/> |
| | | <#input id="buyRemark" name="已购买使用说明" underline="true"/> |
| | | <#input id="unBuyRemark" name="未购买使用说明" underline="true"/> |
| | | <#input id="banner" name="轮播图 逗号分隔" underline="true"/> |
| | | <#input id="grantCount" name="发放数量 为空表示不限"/> |
| | | </div> |
| | | |
| | | <div class="col-sm-6"> |
| | | <#input id="limitCount" name=" 限购数量 为空表示不限" underline="true"/> |
| | | <#input id="endTime" name="有效期 不填表示永久" underline="true"/> |
| | | <#input id="useWeeks" name="可使用时间段,周,多个逗号分隔" underline="true"/> |
| | | <#input id="useTimes" name="可使用时间段,时分秒,多个逗号分隔" underline="true"/> |
| | | <#input id="unUseTimes" name="不可用时间段,yyyy-MM-dd HH:mm:ss,多个逗号分隔" underline="true"/> |
| | | <#input id="useScope" name="使用范围1门店2场地" underline="true"/> |
| | | <#input id="useIds" name="根据适用范围,存储门店id或场地id,多个逗号分隔" underline="true"/> |
| | | <#input id="introduce" name="惠民卡介绍" underline="true"/> |
| | | <#input id="sort" name="排序" underline="true"/> |
| | | <#input id="storeId" name="门店id" underline="true"/> |
| | | <!-- 惠民卡类型 --> |
| | | <el-form-item label="惠民卡类型" prop="huiMinType"> |
| | | <el-radio-group v-model="huiminCard.huiMinType"> |
| | | <el-radio :label="1">年度卡</el-radio> |
| | | <el-radio :label="2">年内卡</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | |
| | | <!-- 售卖金额 --> |
| | | <el-form-item label="售卖金额" prop="salesMoney"> |
| | | <el-input placeholder="请输入内容" v-model="huiminCard.salesMoney"> |
| | | <template slot="append">¥</template> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <!-- 封面图片 --> |
| | | <el-row> |
| | | <el-form-item label="封面图片2" prop="cover"> |
| | | <el-col :span="12"> |
| | | <div class="upload-area text-center"> |
| | | <el-upload |
| | | :limit="1" |
| | | action="/tCouponManage/uploadPic" |
| | | list-type="picture-card" |
| | | :multiple="false" |
| | | accept="." |
| | | :on-success="handleUnBuyCoverSuccess" |
| | | :before-upload="beforeUpload" |
| | | :on-exceed="handleUnBuyCoverExceed" |
| | | :on-remove="handleUnBuyCoverRemove"> |
| | | <i class="el-icon-plus avatar-uploader-icon"></i> |
| | | </el-upload> |
| | | <span>未购买封面</span> |
| | | </div> |
| | | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="upload-area text-center" style="display: flex"> |
| | | <el-upload |
| | | :limit="1" |
| | | class="avatar-uploader" |
| | | action="/tCouponManage/uploadPic" |
| | | list-type="picture-card" |
| | | :multiple="false" |
| | | accept="." |
| | | :on-success="handleBuyCoverSuccess" |
| | | :before-upload="beforeUpload" |
| | | :on-remove="handleBuyCoverRemove"> |
| | | <i class="el-icon-plus avatar-uploader-icon"></i> |
| | | </el-upload> |
| | | <span>已购买封面</span> |
| | | </div> |
| | | </el-col> |
| | | </el-form-item> |
| | | </el-row> |
| | | |
| | | |
| | | <!-- 使用说明 --> |
| | | <el-form-item label="使用说明" prop="unBuyRemark"> |
| | | <el-input |
| | | type="textarea" |
| | | :autosize="{ minRows: 2, maxRows: 4}" |
| | | placeholder="请输入少于200字使用说明" |
| | | v-model="huiminCard.unBuyRemark"> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 使用期限 --> |
| | | <el-form-item label="使用期限" prop="buyRemark"> |
| | | <el-input |
| | | type="textarea" |
| | | :autosize="{ minRows: 2, maxRows: 4}" |
| | | placeholder="请输入少于200字使用说明" |
| | | v-model="huiminCard.buyRemark"> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 轮播介绍图 --> |
| | | <el-form-item label="轮播介绍图" prop="banner"> |
| | | <div class="upload-area"> |
| | | <div class="d-flex align-items-center justify-content-between"> |
| | | <el-upload |
| | | :limit="5" |
| | | class="avatar-uploader" |
| | | action="/tCouponManage/uploadPic" |
| | | list-type="picture-card" |
| | | accept="." |
| | | :on-success="handleSuccess" |
| | | :before-upload="beforeUpload" |
| | | :on-remove="handleRemove"> |
| | | <i class="el-icon-plus avatar-uploader-icon"></i> |
| | | </el-upload> |
| | | <span>点击上传,最多5张</span> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | |
| | | <div class="row btn-group-m-t"> |
| | | <div class="col-sm-10"> |
| | | <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="THuiminCardInfoDlg.addSubmit()"/> |
| | | <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="THuiminCardInfoDlg.close()"/> |
| | | |
| | | <!-- 发放数量 --> |
| | | <el-form-item label="发放数量"> |
| | | <el-input v-model="huiminCard.grantCount"></el-input> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 限购数量 --> |
| | | <el-form-item label="限购数量"> |
| | | <el-input v-model="huiminCard.limitCount"></el-input> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 有效期 --> |
| | | <el-form-item label="有效期"> |
| | | <el-date-picker |
| | | v-model="huiminCard.endTime" |
| | | type="date" |
| | | placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 可用时间 --> |
| | | <el-form-item label="可用时间" prop="weeks"> |
| | | <el-card |
| | | shadow="never" |
| | | v-for="(weekGroup, groupIndex) in huiminCard.weeks" |
| | | :key="'weekGroup_' + groupIndex"> |
| | | <div slot="header" |
| | | style="display: flex; |
| | | align-items: center; |
| | | height: 18px; |
| | | padding: 0 16px;"> |
| | | <el-button type="text" v-on:click="addWeek()">添加</el-button> |
| | | </div> |
| | | |
| | | <div class="form-group" style="display: flex; justify-content: space-between;"> |
| | | <div |
| | | class="col-md-1" |
| | | style="flex: 1 0 calc(100% / 7);" |
| | | v-for="(day, dayIndex) in weekGroup.days" |
| | | :key="dayIndex"> |
| | | <input |
| | | class="form-check-input" |
| | | type="checkbox" |
| | | :name="'week_'+''+groupIndex" |
| | | :value="day.value" |
| | | v-model="day.checked"> |
| | | <label class="form-check-label"> |
| | | {{ day.label }} |
| | | </label> |
| | | </div> |
| | | </div> |
| | | <!-- 时间输入和删除按钮 --> |
| | | <div class="row g-3"> |
| | | <div class="col-md-6" style="display: flex"> |
| | | <el-time-select |
| | | placeholder="起始时间" |
| | | v-model="weekGroup.startTime" |
| | | :picker-options="{ |
| | | start: '00:00', |
| | | step: '01:00', |
| | | end: '23:00'}" |
| | | > |
| | | </el-time-select> |
| | | <el-time-select |
| | | placeholder="结束时间" |
| | | v-model="weekGroup.endTime" |
| | | :picker-options="{ |
| | | start: '00:00', |
| | | step: '01:00', |
| | | end: '23:00', |
| | | minTime: weekGroup.startTime}"> |
| | | </el-time-select> |
| | | </div> |
| | | <div class="col-md-6"> |
| | | <button |
| | | type="button" |
| | | class="btn btn-danger" |
| | | style="float: right" |
| | | v-on:click="removeWeek(groupIndex)" |
| | | > |
| | | <i class="fa fa-trash"></i> 删除 |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-form-item> |
| | | |
| | | <!-- 不可用时间 --> |
| | | <el-form-item label="不可用时间" prop="unUseTimes"> |
| | | <el-button type="text" v-on:click="addUnUseTime()">添加</el-button> |
| | | <div v-for="(item, dayIndex) in times" |
| | | :key="dayIndex" |
| | | class="date-picker-item mb-2"> |
| | | <el-date-picker |
| | | type="datetime" |
| | | placeholder="选择日期" |
| | | v-model="item.date"> |
| | | </el-date-picker> |
| | | <button |
| | | type="button" |
| | | class="btn btn-danger btn-sm ml-2" |
| | | v-on:click="removeUnUseTime(dayIndex)"> |
| | | 删除 |
| | | </button> |
| | | </div> |
| | | </el-form-item> |
| | | |
| | | <!-- 适用范围 --> |
| | | <el-form-item label="适用范围" prop="useScope"> |
| | | <el-radio v-model="huiminCard.useScope" label="1">指定门店</el-radio> |
| | | <el-radio v-model="huiminCard.useScope" label="2">指定场地</el-radio> |
| | | </el-form-item> |
| | | |
| | | <!-- 指定门店 --> |
| | | <el-form-item label="指定门店" v-if="huiminCard.useScope === '1'" prop="storeIds"> |
| | | <el-button type="text" v-on:click="handleSelectStore()">选择门店</el-button> |
| | | <el-table |
| | | :data="tableData" |
| | | height="250" |
| | | border> |
| | | <el-table-column |
| | | prop="province" |
| | | label="所在省市"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="operatorName" |
| | | label="所属运营商"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="storeName" |
| | | label="门店名称"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="ids" |
| | | label="闸机ID"> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | v-on:click="handleRemoveStore(scope.$index)" |
| | | icon="el-icon-delete" |
| | | >删除 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-form-item> |
| | | |
| | | <!-- 指定场地 --> |
| | | <el-form-item label="指定场地" v-if="huiminCard.useScope === '2'" prop="siteIds"> |
| | | <el-button type="text" v-on:click="handleSelectStore()">选择场地</el-button> |
| | | <el-table |
| | | :data="tableData" |
| | | height="250" |
| | | border> |
| | | <el-table-column |
| | | prop="province" |
| | | label="所在省市"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="operatorName" |
| | | label="所属运营商"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="storeName" |
| | | label="门店名称"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="ids" |
| | | label="闸机ID"> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | v-on:click="handleRemoveStore(scope.$index)" |
| | | icon="el-icon-delete" |
| | | >删除 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-form-item> |
| | | |
| | | <!-- 惠民卡介绍 --> |
| | | <el-form-item label="惠民卡介绍" prop="introduce"> |
| | | <textarea type="text/plain" v-model="introduces" id="editor_1"></textarea> |
| | | </el-form-item> |
| | | |
| | | <!-- 排序 --> |
| | | <el-form-item label="排序"> |
| | | <el-input v-model="huiminCard.sort"></el-input> |
| | | </el-form-item> |
| | | |
| | | |
| | | <!-- 操作按钮 --> |
| | | <div class="row mt-5"> |
| | | <div class="col-sm-9 offset-sm-3"> |
| | | <button type="button" v-on:click="submitForm('formRef')" class="btn btn-primary px-4">提交保存</button> |
| | | </div> |
| | | </div> |
| | | <!-- 选择门店 --> |
| | | <el-dialog |
| | | title="选择门店" |
| | | :visible.sync="dialogVisible2" |
| | | width="80%" |
| | | :before-close="handleStoreClose"> |
| | | <el-form ref="form" :model="storeForm" label-width="80px"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="所在省"> |
| | | <el-select v-model="storeForm.provinceCode" size="mini" filterable placeholder="请选择"> |
| | | <el-option |
| | | v-for="item in provinces" |
| | | :key="item.code" |
| | | :label="item.name" |
| | | :value="item.code"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="所在市2"> |
| | | <el-select v-model="storeForm.cityCode" size="mini" filterable placeholder="请选择"> |
| | | <el-option |
| | | v-for="item in cities" |
| | | :key="item.citycode" |
| | | :label="item.name" |
| | | :value="item.citycode"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="所属运营商"> |
| | | <el-input size="mini" v-model="storeForm.operatorId" placeholder="请输入内容"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="门店名称"> |
| | | <el-input size="mini" v-model="storeForm.storeName" placeholder="请输入内容"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-button v-on:click="storeList" style="background-color:#1ab394;color: #ffffff" size="mini" icon="el-icon-search"> |
| | | 搜索 |
| | | </el-button> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | </div> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-table |
| | | v-loading="tableStoreLoading" |
| | | :data="tableStoreData" |
| | | height="250" |
| | | v-on:selection-change="handleSelectionChange" |
| | | border> |
| | | <el-table-column |
| | | type="selection" |
| | | width="55"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="province" |
| | | label="所在省市"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="operatorName" |
| | | label="所属运营商"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="storeName" |
| | | label="门店名称"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="ids" |
| | | label="闸机ID"> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-pagination |
| | | background |
| | | layout="prev, pager, next" |
| | | v-on:pagination="storeList" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | :total="tableStoreTotal"> |
| | | </el-pagination> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button v-on:click="dialogVisible2 = false">取 消</el-button> |
| | | <el-button type="primary" v-on:click="handleStore">确 定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <!-- 选择场地 --> |
| | | <el-dialog |
| | | title="选择场地" |
| | | :visible.sync="dialogVisible3" |
| | | width="80%" |
| | | :before-close="handleSiteClose"> |
| | | |
| | | <el-table |
| | | v-loading="tableSiteLoading" |
| | | :data="tableSiteData" |
| | | height="250" |
| | | v-on:selection-change="handleSelectionChange" |
| | | border> |
| | | <el-table-column |
| | | type="selection" |
| | | width="55"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="province" |
| | | label="所在省市"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="operatorName" |
| | | label="所属运营商"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="storeName" |
| | | label="门店名称"> |
| | | |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="siteName" |
| | | label="场地名称"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="ids" |
| | | label="闸机ID2"> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="tableSiteTotal>0" |
| | | :total="tableSiteTotal" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | v-on:pagination="siteList"></pagination> |
| | | |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button v-on:click="dialogVisible3 = false">取 消</el-button> |
| | | <el-button type="primary" v-on:click="handleSite">确 定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </el-form> |
| | | </div> |
| | | <script src="${ctxPath}/static/modular/system/tHuiminCard/tHuiminCard_info.js"></script> |
| | | |
| | | <style> |
| | | .form-container { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); |
| | | padding: 2rem; |
| | | } |
| | | |
| | | .upload-area { |
| | | border: 2px dashed #dee2e6; |
| | | border-radius: 8px; |
| | | padding: 1.5rem; |
| | | transition: all 0.3s; |
| | | cursor: pointer; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | min-height: 200px; /* 设置一个最小高度,确保有足够的空间 */ |
| | | position: relative; /* 为图片定位提供基准 */ |
| | | overflow: hidden; /* 防止图片溢出 */ |
| | | } |
| | | |
| | | .upload-area:hover { |
| | | border-color: #4a90e2; |
| | | background: #f8f9fa; |
| | | } |
| | | |
| | | .upload-area i { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | input[type=file] { |
| | | display: none; |
| | | } |
| | | |
| | | |
| | | </style> |
| | | |
| | | <script src="${ctxPath}/modular/system/tHuiminCard/tHuiminCard_info.js"></script> |
| | | <script src="${ctxPath}/js/vue/vue.js"></script> |
| | | <script src="${ctxPath}/js/elementui/index.js"></script> |
| | | <link rel="stylesheet" href="${ctxPath}/js/elementui/index.css"> |
| | | <script> |
| | | let vue = new Vue({ |
| | | el: '#app0', |
| | | props: { |
| | | // 数量限制 |
| | | limit: { |
| | | type: Number, |
| | | default: 2 |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | storeForm: { |
| | | provinceCode: null, |
| | | cityCode: null, |
| | | operatorId: null, |
| | | storeName: '', |
| | | }, |
| | | |
| | | provinces: [], |
| | | cities: [], |
| | | stores: [], |
| | | operations: [], |
| | | autoUpload: true,//自动上传 |
| | | previewImg: '',//模型数据,用于上传图片完成后图片预览 |
| | | dialogVisible: false, |
| | | dialogVisible2: false, |
| | | dialogVisible3: false, |
| | | times: [{}], |
| | | banners: [], |
| | | introduces: null, |
| | | multipleSelection1: [], |
| | | multipleSelection2: [], |
| | | huiminCard: { |
| | | id: null, |
| | | huiMinName: null, |
| | | huiMinType: null, |
| | | salesMoney: null, |
| | | buyCover: null, |
| | | unBuyCover: null, |
| | | buyRemark: null, |
| | | unBuyRemark: null, |
| | | grantCount: null, |
| | | limitCount: null, |
| | | banner: null, |
| | | endTime: null, |
| | | useWeeks: null, |
| | | useTimes: null, |
| | | introduce: null, |
| | | weeks: [ |
| | | { |
| | | days: [ // 每个星期组的星期选项 |
| | | { |
| | | value: '1', |
| | | label: '星期一', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '2', |
| | | label: '星期二', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '3', |
| | | label: '星期三', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '4', |
| | | label: '星期四', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '5', |
| | | label: '星期五', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '6', |
| | | label: '星期六', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '7', |
| | | label: '星期日', |
| | | checked: false, |
| | | } |
| | | ], |
| | | }, |
| | | ], |
| | | unUseTimes: [ |
| | | {date: null} |
| | | ], |
| | | useScope: '1', |
| | | useIds: null, |
| | | sort: null, |
| | | storeId: null |
| | | }, |
| | | tableData: [], |
| | | tableStoreData: [], |
| | | tableStoreTotal: 0, |
| | | tableStoreLoading: false, |
| | | tableSiteData: [], |
| | | tableSiteTotal: 0, |
| | | tableSiteLoading: false, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | }, |
| | | |
| | | rules: { |
| | | buyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}], |
| | | cover: [{ |
| | | validator: (rule, value, callback) => { |
| | | if (!this.huiminCard.unBuyCover) { |
| | | callback(new Error('请上传未购买封面')); |
| | | } |
| | | if (!this.huiminCard.buyCover) { |
| | | callback(new Error('请上传已购买封面')); |
| | | } |
| | | callback(); |
| | | }, |
| | | trigger: 'blur' |
| | | }], |
| | | buyCover: [{required: true, message: '已购买封面不能为空', trigger: 'blur'}], |
| | | huiMinName: [{required: true, message: '请输入惠民卡名称', trigger: 'blur'}], |
| | | huiMinType: [{required: true, message: '请选择惠民卡类型', trigger: 'change'}], |
| | | salesMoney: [{required: true, message: '请输入售卖金额', trigger: 'blur'}], |
| | | unBuyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}], |
| | | banner: [{required: true, message: '请上传轮播图', trigger: 'blur'}], |
| | | limitCount: [{required: true, message: '请输入限购数量', trigger: 'blur'}], |
| | | weeks: [ |
| | | { |
| | | required: true, |
| | | message: '请填写可用时间', |
| | | trigger: 'blur', |
| | | validator: (rule, value, callback) => { |
| | | const everyFalse = this.huiminCard.weeks.every(week => |
| | | week.days.every(day => |
| | | day.checked === false |
| | | ) |
| | | ); |
| | | if (everyFalse) { |
| | | callback(new Error('请选择可用星期')); |
| | | } |
| | | const everyNull = this.huiminCard.weeks.every(obj => |
| | | obj.startTime === null || |
| | | obj.endTime === null |
| | | ); |
| | | if (everyNull) { |
| | | callback(new Error('请选择可用时间')); |
| | | } |
| | | callback(); |
| | | }, |
| | | } |
| | | ], |
| | | storeIds: [ |
| | | { |
| | | required: true, |
| | | trigger: 'blur', |
| | | validator: (rule, value, callback) => { |
| | | if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) { |
| | | callback(new Error('请选择指定门店')); |
| | | } |
| | | callback(); |
| | | }, |
| | | } |
| | | ], |
| | | siteIds: [ |
| | | { |
| | | required: true, |
| | | trigger: 'blur', |
| | | validator: (rule, value, callback) => { |
| | | if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) { |
| | | callback(new Error('请选择指定场地')); |
| | | } |
| | | callback(); |
| | | }, |
| | | } |
| | | ], |
| | | introduce: [ |
| | | { |
| | | required: true, validator: (rule, value, callback) => { |
| | | let content = UE.getEditor('editor_1').getContent(); |
| | | console.log(content) |
| | | if (content.length === 0) { |
| | | callback(new Error('请输入详细介绍')); |
| | | } else { |
| | | callback(); |
| | | } |
| | | } |
| | | } |
| | | ], |
| | | }, |
| | | } |
| | | }, |
| | | methods: { |
| | | handleUnBuyCoverSuccess(res, file) { |
| | | this.huiminCard.unBuyCover = res; |
| | | }, |
| | | handleUnBuyCoverExceed() { |
| | | Feng.error('最多上传一张图片'); |
| | | }, |
| | | handleUnBuyCoverRemove(file, fileList) { |
| | | this.huiminCard.unBuyCover = ''; |
| | | }, |
| | | handleBuyCoverSuccess(res, file) { |
| | | this.huiminCard.buyCover = res; |
| | | }, |
| | | handleBuyCoverRemove(file, fileList) { |
| | | this.huiminCard.buyCover = ''; |
| | | }, |
| | | handleSuccess(res, file) { |
| | | this.banners.push(res) |
| | | this.huiminCard.banner = this.banners.join(','); |
| | | }, |
| | | |
| | | beforeUpload(file) { |
| | | console.log(111111) |
| | | const isLt2M = file.size / 1024 / 1024 < 10; |
| | | if (!isLt2M) { |
| | | Feng.error('上传图片大小不能超过 10MB!'); |
| | | } |
| | | return isLt2M; |
| | | }, |
| | | handleRemove(file, fileList) { |
| | | const fileUrl = file.response; |
| | | this.banners.forEach((item, index) => { |
| | | if (item === fileUrl) { |
| | | this.banners.splice(index, 1); |
| | | } |
| | | }); |
| | | this.huiminCard.banner = this.banners.join(','); |
| | | }, |
| | | addWeek() { |
| | | // 新增一个包含默认星期的组 |
| | | this.huiminCard.weeks.push({ |
| | | days: [ |
| | | { |
| | | value: '1', |
| | | label: '星期一', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '2', |
| | | label: '星期二', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '3', |
| | | label: '星期三', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '4', |
| | | label: '星期四', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '5', |
| | | label: '星期五', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '6', |
| | | label: '星期六', |
| | | checked: false, |
| | | }, |
| | | { |
| | | value: '7', |
| | | label: '星期日', |
| | | checked: false, |
| | | } |
| | | ], |
| | | }); |
| | | }, |
| | | removeWeek(index) { |
| | | this.huiminCard.weeks.splice(index, 1); |
| | | console.log(this.weeks) |
| | | }, |
| | | addUnUseTime() { |
| | | this.times.push({date: null}); |
| | | }, |
| | | removeUnUseTime(index) { |
| | | this.times.splice(index, 1); |
| | | }, |
| | | storeList() { |
| | | this.tableStoreLoading = true; |
| | | let vm = this; |
| | | let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/storeList", |
| | | (data) => { |
| | | vm.tableStoreData = data.records; // 使用 vm 替代 this |
| | | vm.tableStoreTotal = data.total; |
| | | vm.tableStoreLoading = false; |
| | | console.log('成功获取数据:', vm.tableStoreData); // 验证数据 |
| | | }, |
| | | (data) => { |
| | | vm.tableStoreLoading = false; |
| | | Feng.error("请求失败: " + data.responseJSON.message); |
| | | } |
| | | ); |
| | | this.storeForm.pageNum = vm.queryParams.pageNum; |
| | | this.storeForm.pageSize = vm.queryParams.pageSize |
| | | ajax.set(this.storeForm); |
| | | |
| | | ajax.start(); |
| | | }, |
| | | siteList() { |
| | | this.tableSiteLoading = true; |
| | | let vm = this; |
| | | let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/siteList", |
| | | (data) => { |
| | | vm.tableSiteData = data.records; // 使用 vm 替代 this |
| | | vm.tableSiteTotal = data.total; |
| | | vm.tableSiteLoading = false; |
| | | console.log('成功获取数据:', vm.tableSiteData); // 验证数据 |
| | | }, |
| | | (data) => { |
| | | vm.tableSiteLoading = false; |
| | | Feng.error("请求失败: " + data.responseJSON.message); |
| | | } |
| | | ); |
| | | ajax.start(); |
| | | }, |
| | | handleStoreClose() { |
| | | this.dialogVisible2 = false; |
| | | }, |
| | | handleSiteClose() { |
| | | this.$confirm('确认关闭?1') |
| | | .then(_ => { |
| | | this.dialogVisible3 = false; |
| | | }) |
| | | .catch(_ => { |
| | | }); |
| | | }, |
| | | handleSelectionChange(val) { |
| | | if (this.huiminCard.useScope === '1') { |
| | | this.multipleSelection1 = val; |
| | | } else if (this.huiminCard.useScope === '2') { |
| | | this.multipleSelection2 = val; |
| | | } |
| | | |
| | | }, |
| | | handleRemoveStore(index) { |
| | | this.tableData.splice(index, 1); |
| | | }, |
| | | handleSelectStore() { |
| | | this.queryParams.pageNum = 1; |
| | | this.queryParams.pageSize = 10; |
| | | if (this.huiminCard.useScope === '1') { |
| | | this.dialogVisible2 = true; |
| | | this.storeList(); |
| | | } else if (this.huiminCard.useScope === '2') { |
| | | this.dialogVisible3 = true; |
| | | this.siteList(); |
| | | } |
| | | }, |
| | | handleStore() { |
| | | if (this.multipleSelection1.length === 0) { |
| | | Feng.info('请选择数据'); |
| | | return; |
| | | } |
| | | this.dialogVisible2 = false |
| | | this.tableData = this.multipleSelection1; |
| | | this.huiminCard.useIds = this.tableData.map(item => item.storeId).join(','); |
| | | }, |
| | | handleSite() { |
| | | if (this.multipleSelection2.length === 0) { |
| | | Feng.info('请选择数据'); |
| | | return; |
| | | } |
| | | this.dialogVisible3 = false |
| | | this.tableData = this.multipleSelection2; |
| | | this.huiminCard.useIds = this.tableData.map(item => item.siteId).join(','); |
| | | }, |
| | | submitForm(formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | console.log(valid) |
| | | if (valid) { |
| | | let data = this.huiminCard; |
| | | let weeks = data.weeks; |
| | | var formatWeekAndTime1 = formatWeekAndTime(weeks); |
| | | data.useTimes = formatWeekAndTime1.useTimes; |
| | | data.useWeeks = formatWeekAndTime1.useWeeks; |
| | | data.unUseTimes = formatUnUseTimes(this.times); |
| | | data.introduce = UE.getEditor('editor_1').getContent(); |
| | | console.log(data.introduce) |
| | | |
| | | let vm = this; |
| | | let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/add", |
| | | (data) => { |
| | | window.parent.THuiminCard.table.refresh(); |
| | | THuiminCardInfoDlg.close(); |
| | | }, |
| | | (data) => { |
| | | vm.tableStoreLoading = false; |
| | | Feng.error("请求失败: " + data.responseJSON.message); |
| | | } |
| | | ); |
| | | ajax.set(data) |
| | | ajax.start(); |
| | | } |
| | | }); |
| | | }, |
| | | }, |
| | | created() { |
| | | let editor_1 = UE.getEditor('editor_1'); |
| | | |
| | | |
| | | let ajax = new $ax(Feng.ctxPath + "/base/region/getProvince", |
| | | (data) => { |
| | | this.provinces = data; |
| | | }, |
| | | (data) => { |
| | | Feng.error("请求失败: " + data.responseJSON.message); |
| | | } |
| | | ); |
| | | ajax.start(); |
| | | |
| | | let ajax2 = new $ax(Feng.ctxPath + "/base/region/getCity", |
| | | (data) => { |
| | | this.cities = data; |
| | | }, |
| | | (data) => { |
| | | Feng.error("请求失败: " + data.responseJSON.message); |
| | | } |
| | | ); |
| | | ajax2.start(); |
| | | |
| | | }, |
| | | }); |
| | | |
| | | function formatWeekAndTime(data) { |
| | | const weekTimeMap = {}; |
| | | |
| | | data.forEach(item => { |
| | | // 确定时间段(优先使用直接字段) |
| | | const startTime = item.startTime || item.time?.startTime || ''; |
| | | const endTime = item.endTime || item.time?.endTime || ''; |
| | | const timePair = startTime + ";" + endTime; |
| | | |
| | | // 遍历days数组,记录每个选中星期对应的时间段 |
| | | item.days.forEach(day => { |
| | | if (day.checked && day.value) { |
| | | weekTimeMap[day.value] = timePair; |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | // 按星期数字排序并生成最终字符串 |
| | | const sortedWeeks = Object.keys(weekTimeMap).sort((a, b) => a - b); |
| | | const useWeeks = sortedWeeks.join(','); |
| | | const useTimes = sortedWeeks.map(week => weekTimeMap[week]).join(','); |
| | | |
| | | return {useWeeks, useTimes}; |
| | | } |
| | | |
| | | function formatUnUseTimes(nUseTimes) { |
| | | if (!nUseTimes) { |
| | | return ""; |
| | | } |
| | | let dates = []; |
| | | nUseTimes.forEach(item => { |
| | | // 格式化 |
| | | const date = item.date; |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要+1 |
| | | const day = String(date.getDate()).padStart(2, '0'); |
| | | const hours = String(date.getHours()).padStart(2, '0'); |
| | | const minutes = String(date.getMinutes()).padStart(2, '0'); |
| | | const seconds = String(date.getSeconds()).padStart(2, '0'); |
| | | dates.push(year + '-' + month + '-' + day + '-' + hours + ':' + minutes + ':' + seconds) |
| | | }); |
| | | return dates.join(','); |
| | | } |
| | | |
| | | </script> |
| | | |
| | | |
| | | </body> |
| | | @} |