edit.php 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. <!-- 引一个当前组件 -->
  2. <?php
  3. use common\helpers\ComponentHelper;
  4. use common\helpers\AddonHelper;
  5. if ($has_coupon) {
  6. ComponentHelper::loadComponentView('coupon-select', AddonHelper::getAddonRootPath('Coupon') . 'backend/views/components');
  7. }
  8. ComponentHelper::loadComponentView('com-dialog-select');
  9. ComponentHelper::loadComponentView('com-image');
  10. ?>
  11. <div id="app" v-cloak>
  12. <el-card shadow="never" style="border:0;min-width: 1200px;">
  13. <el-form ref="formData" :model="formData" label-width="200px" :rules="rules">
  14. <el-form-item label="活动名称" prop="title">
  15. <el-input v-model="formData.title" style="max-width: 200px;"></el-input>
  16. </el-form-item>
  17. <el-form-item label="活动时间" prop="dataTime">
  18. <el-date-picker
  19. v-model="formData.dataTime"
  20. type="datetimerange"
  21. unlink-panels
  22. range-separator="至"
  23. start-placeholder="开始日期"
  24. end-placeholder="结束日期"
  25. :picker-options="pickerOptions"
  26. :disabled="isDisabled"
  27. @change="updateTime">
  28. </el-date-picker>
  29. <el-checkbox v-model="is_forever" @change="changeForever">永久</el-checkbox>
  30. </el-form-item>
  31. <el-form-item label="参与类型">
  32. <el-radio-group v-model="formData.join_type" @change="radioGroupJoinType">
  33. <el-radio :label="0">平台用户</el-radio>
  34. <el-radio :label="1">推三返一用户</el-radio>
  35. </el-radio-group>
  36. </el-form-item>
  37. <el-form-item label="发起人权限">
  38. <el-radio-group v-model="formData.initiate_type">
  39. <template v-if="formData.join_type==0">
  40. <el-radio :label="0">全部用户</el-radio>
  41. <el-radio :label="1">新用户</el-radio>
  42. <el-radio :label="2">权重用户</el-radio>
  43. </template>
  44. <template v-else>
  45. <el-radio :label="0">全部用户</el-radio>
  46. <el-radio :label="1">新用户(注册七天内)</el-radio>
  47. <el-radio :label="2">权重用户</el-radio>
  48. </template>
  49. </el-radio-group>
  50. </el-form-item>
  51. <el-form-item label="" v-if="formData.initiate_type == 2">
  52. <el-checkbox-group v-model="formData.initiate_level">
  53. <el-checkbox v-for="(item, key) in level_arr" :key="item.name" :label="item.level">{{ item.name }}</el-checkbox>
  54. </el-checkbox-group>
  55. </el-form-item>
  56. <el-form-item label="参与人权限">
  57. <el-radio-group v-model="formData.consume_type">
  58. <template v-if="formData.join_type==0">
  59. <el-radio :label="0">全部用户</el-radio>
  60. <el-radio :label="1">新用户</el-radio>
  61. <el-radio :label="2">权重用户</el-radio>
  62. </template>
  63. <template v-else>
  64. <el-radio :label="0">全部用户</el-radio>
  65. <el-radio :label="1">新用户(注册七天内)</el-radio>
  66. <el-radio :label="2">权重用户</el-radio>
  67. </template>
  68. </el-radio-group>
  69. </el-form-item>
  70. <el-form-item label="" v-if="formData.consume_type == 2">
  71. <el-checkbox-group v-model="formData.consume_level">
  72. <el-checkbox v-for="(item, key) in level_arr" :key="item.name" :label="item.level">{{ item.name }}</el-checkbox>
  73. </el-checkbox-group>
  74. </el-form-item>
  75. <el-form-item label="优惠/抵扣不发奖励">
  76. <el-radio-group v-model="formData.is_grant">
  77. <el-radio :label="0">关闭</el-radio>
  78. <el-radio :label="1">开启</el-radio>
  79. </el-radio-group>
  80. </el-form-item>
  81. <el-form-item label="商品设置">
  82. <div class="button-group">
  83. <com-dialog-select v-if="formData.item_info.length < 1 && formData.cate_info.length < 1" :multiple="false" @selected="goodsSelect" title="商品选择">
  84. <el-button size="small">选择商品</el-button>
  85. </com-dialog-select>
  86. <div v-if="formData.item_info.length < 1 && formData.cate_info.length < 1"><el-button size="small" @click.sync='chooseCate'>选择分类</el-button></div>
  87. </div>
  88. <template v-if="formData.item_info.length > 0">
  89. <div style="color: #ff4544;">仅可添加一个商品</div>
  90. <div style="max-height: 300px;overflow-y: auto">
  91. <el-table :data="formData.item_info" border style="width: 60%">
  92. <el-table-column type="index" align="center" label="序号" width="50"></el-table-column>
  93. <el-table-column prop="id" align="center" label="商品id" width="100"></el-table-column>
  94. <el-table-column prop="name,cover_pic" label="商品名称" >
  95. <template slot-scope="scope">
  96. <div flex="box:first">
  97. <div style="padding-right: 10px;">
  98. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  99. </div>
  100. <div style="display:flex;flex-direction:column;align-items:flex-start;">
  101. <div>{{scope.row.name}}</div>
  102. <div>
  103. <span style="color: #ff4544;" v-if="scope.row.price">¥{{ scope.row.price }}</span>
  104. <span style="margin-left: 20px;" v-if="scope.row.stock">库存:{{ scope.row.stock }}</span>
  105. </div>
  106. </div>
  107. </div>
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="操作" width="100">
  111. <template slot-scope="scope">
  112. <el-button @click="deleteGoods(scope.$index)" type="primary" size="mini">删除</el-button>
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. </div>
  117. </template>
  118. <template v-if="formData.cate_info.length > 0">
  119. <div style="color: #ff4544;">仅可选择一个分类</div>
  120. <div style="max-height: 300px;overflow-y: auto">
  121. <el-table :data="formData.cate_info" border style="width: 60%">
  122. <el-table-column type="index" align="center" label="序号" width="50"></el-table-column>
  123. <el-table-column prop="id" align="center" label="分类ID" width="100"></el-table-column>
  124. <el-table-column prop="name,pic" label="分类名称" >
  125. <template slot-scope="scope">
  126. <div flex="box:first">
  127. <div style="padding-right: 10px;" v-if="scope.row.cover_pic">
  128. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  129. </div>
  130. <div style="display:flex;flex-direction:column;align-items:flex-start;">
  131. <div>{{scope.row.name}}</div>
  132. </div>
  133. </div>
  134. </template>
  135. </el-table-column>
  136. <el-table-column label="操作" width="100">
  137. <template slot-scope="scope">
  138. <el-button @click="deleteCate(scope.$index)" type="primary" size="mini">删除</el-button>
  139. </template>
  140. </el-table-column>
  141. </el-table>
  142. </div>
  143. </template>
  144. </el-form-item>
  145. <el-form-item label="奖励类型">
  146. <el-radio-group v-model="formData.reward_type" @change="switchReward">
  147. <el-radio :label="1">条件奖励</el-radio>
  148. <el-radio :label="2">阶梯奖励</el-radio>
  149. </el-radio-group>
  150. </el-form-item>
  151. <el-form-item label="">
  152. <el-table :data="rewardInfo" stripe style="width: 100%">
  153. <el-table-column prop="num" label="奖励条件" width="300" class="accon">
  154. <template slot-scope="scope">
  155. {{ formData.reward_type == 1 ? '每' : '' }}推荐
  156. <el-input v-model="scope.row.num" type="number" style="max-width: 200px;padding-left: 10px;" @input="validatorInfo($event,scope.$index)">
  157. <template slot="append">人购买</template>
  158. </el-input>
  159. </template>
  160. </el-table-column>
  161. <el-table-column prop="data" label="奖励内容">
  162. <template slot-scope="scope">
  163. <div style="margin-bottom: 14px;" v-for="(type,index) in scope.row.data" :key="index">
  164. <div class="ratio_change" v-show="scope.row.data[index].key!=0">
  165. <el-radio v-model="scope.row.data[index].ratio" :label="0">固定值</el-radio>
  166. <el-radio v-model="scope.row.data[index].ratio" :label="1">百分比</el-radio>
  167. </div>
  168. <div style="margin-bottom: 10px;" flex>
  169. <el-select v-model="scope.row.data[index].key" placeholder="请选择" @change="updateType($event,scope.$index,index)">
  170. <el-option
  171. v-for="item in rechargeType"
  172. :key="item.value"
  173. :label="item.label"
  174. :value="item.value"
  175. :disabled="scope.row.data.findIndex(v => v.key == item.value) != -1"
  176. >
  177. </el-option>
  178. </el-select>
  179. <el-button v-if="scope.row.data[index].key == 0" style="margin-left: 12px;" @click="openCouponPop(scope.$index)">选择优惠券</el-button>
  180. <div style="margin-left: 10px;" v-else>
  181. <el-input v-model="scope.row.data[index].data" type="number" @input="validatorInfo($event,scope.$index,2,scope.row.data[index].key)">
  182. <template slot="append">
  183. <span v-if="scope.row.data[index].ratio==1">%</span>
  184. <span v-else>{{scope.row.data[index].key == 2?'分':'元'}}</span>
  185. </template>
  186. </el-input>
  187. </div>
  188. <el-button @click="delAward(scope.row.data[index].key,scope.$index)" v-if="scope.row.data.length > 1" type="text" icon="el-icon-close" style="color: #ec1717;font-size: 20px;padding: 0;margin-left: 12px;"></el-button>
  189. </div>
  190. <span v-if="has_redpack == false && (scope.row.data[index].type == 'redpack' || scope.row.data[index].type == 'frozen_redpack')" style="color:red;">该奖励需安装红包拓客插件后生效</span>
  191. <el-table v-if="scope.row.data[index].key == 0" :data="scope.row.data[index].data" stripe style="width: 100%;">
  192. <el-table-column prop="name" label="优惠券名称" width="160"></el-table-column>
  193. <el-table-column prop="discount_method" label="优惠券内容"></el-table-column>
  194. <el-table-column label="库存(张)" width="160">
  195. <template slot-scope="couponScope">
  196. {{couponScope.row.total_count == -1?'不限量':couponScope.row.total_count}}
  197. </template>
  198. </el-table-column>
  199. <el-table-column prop="dcount" label="奖励张数" width="160">
  200. <template slot-scope="couponScope">
  201. <el-input v-model="couponScope.row.num" type="number" @input="validatorInfo($event,scope.$index,3,0,couponScope.$index)">
  202. <template slot="append">张</template>
  203. </el-input>
  204. </template>
  205. </el-table-column>
  206. <el-table-column label="操作" width="100" align="center">
  207. <template slot-scope="couponScope">
  208. <el-button type="text" size="small" @click="delCoupon(couponScope.$index,scope.$index)">删除</el-button>
  209. </template>
  210. </el-table-column>
  211. </el-table>
  212. </div>
  213. <div v-if="scope.row.data.length != rechargeType.length">
  214. <el-button @click="addAward(scope.$index)" size="small" plain>添加奖励内容</el-button>
  215. </div>
  216. </template>
  217. </el-table-column>
  218. <el-table-column label="操作" width="100" align="center">
  219. <template slot-scope="scope">
  220. <el-button @click="deleteReward(scope.$index)" type="text" size="small">删除</el-button>
  221. </template>
  222. </el-table-column>
  223. </el-table>
  224. <div>
  225. <el-button size="small" style="margin-top: 10px;" @click="addRewardInfo" v-if="(formData.reward_type == 1 && rewardInfo.length == 0) || formData.reward_type == 2">添加奖励条件</el-button>
  226. </div>
  227. </el-form-item>
  228. <template v-if="formData.reward_type == 2">
  229. <el-form-item label="阶梯重复奖励">
  230. <el-switch v-model="formData.is_repeat" :active-value="1" :inactive-value="0" active-color="#13ce66"></el-switch>
  231. <div class="tips-text" style="line-height: 24px;">
  232. 开启后阶梯奖励将会按照设置进行重复奖励,比如:<br/>
  233. 手动设置:推荐1人奖励30余额,推第3人奖励50余额;<br/>
  234. 自动奖励:推第4人奖励30余额,推第6人奖励50余额;<br/>
  235. 自动奖励:推第7人奖励30余额,推第9人奖励50余额;<br/>
  236. 自动奖励:以此类推……
  237. </div>
  238. </el-form-item>
  239. <template v-if="formData.is_repeat">
  240. <el-form-item label="阶梯重复奖励-循环奖励">
  241. <el-switch v-model="formData.is_reward_after_n" :active-value="1" :inactive-value="0" active-color="#13ce66"></el-switch>
  242. <div v-if="formData.is_reward_after_n">
  243. <el-select v-model="formData.reward_threshold" size="small">
  244. <el-option v-for="item in rewardInfo"
  245. v-if="item.num > 0"
  246. :key="item.num"
  247. :label="item.num + '人'"
  248. :value="item.num">
  249. </el-option>
  250. </el-select>
  251. <div class="tips-text" style="line-height: 24px;">
  252. 奖励规则如下:<br/>
  253. 推荐1人,奖励5元,<br/>
  254. 推荐3人,奖励7元,<br/>
  255. 推荐5人,奖励9元,<br/>
  256. 开启循环奖励,并设置第3人开始循环奖励:<br/>
  257. 推荐1人,奖励5元,<br/>
  258. 推荐3人,奖励7元,<br/>
  259. 推荐5人,奖励9元,<br/>
  260. 推荐6人,奖励7元,<br/>
  261. 推荐7人,奖励9元,<br/>
  262. 推荐8人,奖励7元,<br/>
  263. 推荐9人,奖励9元,<br/>
  264. 推荐10人,奖励7元,<br/>
  265. 以此类推······<br/>
  266. 注意:首轮循环奖励正常,第二轮开始进行重复奖励<br/>
  267. </div>
  268. </div>
  269. </el-form-item>
  270. </template>
  271. <el-form-item label="冻结第一项奖励">
  272. <el-switch v-model="formData.is_freeze_first_reward" :active-value="1" :inactive-value="0" active-color="#13ce66"></el-switch>
  273. <el-form-item>
  274. <template v-if="formData.is_freeze_first_reward == 1">
  275. <el-radio-group v-model="formData.freeze_first_reward_type">
  276. <el-radio :label="0">全部</el-radio>
  277. <el-radio :label="1">冻结百分比</el-radio>
  278. </el-radio-group>
  279. <div v-if="formData.freeze_first_reward_type == 1">
  280. <el-input v-model="formData.freeze_first_reward_percentage"
  281. style="width: 200px;"
  282. onInput="value=toNumber(value,2); value = value > 100 ? 100 : value"
  283. prop="freeze_first_reward_percentage"
  284. size="small">
  285. <template slot="append">%</template>
  286. </el-input>
  287. <div class="tips-text" style="line-height: 24px;">
  288. 冻结除优惠券以外的资产类,例:用户获得100,冻结30%,则冻结30,另外70无需冻结<br>
  289. </div>
  290. </div>
  291. </template>
  292. </el-form-item>
  293. <div class="tips-text" style="line-height: 24px;">
  294. 开启后,冻结第一项奖励,获取推荐奖励第二项时解冻第一项奖励
  295. </div>
  296. </el-form-item>
  297. <el-form-item label="触发奖励设置">
  298. <el-switch v-model="formData.repeat_setting" :active-value="1" :inactive-value="0" active-color="#13ce66"></el-switch>
  299. <div class="tips-text" style="line-height: 24px;">
  300. 开启后,结算方式应与渠道分红结算方式保持一致,比如:<br/>
  301. 结算方式为支付完成:渠道分红结算方式可设置为支付完成、订单完成;<br/>
  302. 结算方式为订单完成:渠道分红结算方式只可设置为订单完成;<br/>
  303. </div>
  304. </el-form-item>
  305. <el-form-item v-if="formData.repeat_setting == 1" prop="dcount" label="渠道分红设置" width="160">
  306. <span>第</span>
  307. <el-input v-model="formData.agent_limit_num" type="number" style="max-width: 200px;">
  308. <template slot="append">单</template>
  309. </el-input>
  310. <span>及其倍数的订单不触发分佣奖励</span>
  311. </el-form-item>
  312. </template>
  313. <el-form-item>
  314. <el-button type="primary" @click="submitForm" :loading="subLoading">保存</el-button>
  315. </el-form-item>
  316. </el-form>
  317. <!-- 优惠券弹窗 -->
  318. <coupon-select v-if="has_coupon" :coupon-loading="couponPop" :coupon_arr="selCoupon" @submit="determine" @close="showCoupon"></coupon-select>
  319. <el-dialog title="商品类型选择" :visible.sync="goodsCategoryDialogVisible" width="60%">
  320. <div class="search-box">
  321. <div class="input-item" style="padding-right: 10px">
  322. <el-input @keyup.enter.native="getUser" size="small" placeholder="请输分类ID" v-model="searchData.id"> </el-input>
  323. </div>
  324. <div class="input-item" style="padding-right: 10px">
  325. <el-input @keyup.enter.native="getUser" size="small" placeholder="请输分类名称" v-model="searchData.name"> </el-input>
  326. </div>
  327. <el-button type="primary" size="small" @click="getUserClick">搜索</el-button>
  328. <el-button type="warning" size="small" @click="clearSearch" v-if="searchData.id || searchData.name" style="padding: 9px 15px !important;">清除搜索条件</el-button>
  329. </div>
  330. <el-table :data="categoryList" stripe v-loading="listLoading" style="width: 100%" @current-change="clickChange">
  331. <el-table-column prop="date" width="50">
  332. <template slot-scope="scope">
  333. <el-radio v-model="cateInfo" :label="scope.row"><i></i></el-radio>
  334. </template>
  335. </el-table-column>
  336. <el-table-column prop="id" label="ID"> </el-table-column>
  337. <el-table-column prop="name" label="分类名称"></el-table-column>
  338. </el-table>
  339. <div style="text-align: right;margin: 20px 0;">
  340. <el-pagination @current-change="categoryPagination" background layout="prev, pager, next" :page-count="categoryCurrPage"></el-pagination>
  341. </div>
  342. <span slot="footer" class="dialog-footer">
  343. <el-button @click="goodsCategoryDialogVisible = false">取 消</el-button>
  344. <el-button type="primary" @click="selectCate">确 定</el-button>
  345. </span>
  346. </el-dialog>
  347. </el-card>
  348. </div>
  349. <script>
  350. const app = new Vue({
  351. el: '#app',
  352. data() {
  353. return {
  354. id: null,
  355. formData: {
  356. title: "",
  357. start_at: "",
  358. end_at: "",
  359. initiate_type: 0,
  360. initiate_level: [],
  361. consume_type: 0,
  362. is_grant: 0,
  363. consume_level: [],
  364. item_id: [],
  365. item_info: [],
  366. reward_type: 1,
  367. dataTime: [],
  368. reward_info: [],
  369. is_repeat: 0,
  370. join_type: 0,
  371. repeat_setting:0,
  372. agent_limit_num:0,
  373. is_reward_after_n:0,
  374. reward_threshold: undefined,
  375. is_freeze_first_reward: 0,
  376. freeze_first_reward_type: 0,
  377. freeze_first_reward_percentage: 0,
  378. cate_info:[],
  379. },
  380. has_coupon: <?php echo $has_coupon ? 'true' : 'false'; ?>,
  381. level_arr: [
  382. {level:0,name:'默认用户'},
  383. {level:1,name:'用户权重一'},
  384. {level:2,name:'用户权重二'},
  385. ],
  386. has_redpack: <?php echo $has_redpack ? 'true' : 'false'; ?>,
  387. user_level_arr:[],
  388. rebate_user_level_arr:[],
  389. rewardTemp1: [{
  390. num: 0,
  391. data: [{
  392. key: 0,
  393. name: "优惠券",
  394. type: 'coupon',
  395. data: [],
  396. ratio: 0,
  397. }],
  398. }],// 临时存储条件奖励类型值
  399. rewardTemp2: [{
  400. num: 0,
  401. data: [{
  402. key: 0,
  403. name: "优惠券",
  404. type: 'coupon',
  405. data: [],
  406. ratio: 0,
  407. }],
  408. }],// 临时存储阶梯奖励类型值
  409. rewardInfo: [{
  410. num: 0,
  411. data: [{
  412. key: 0,
  413. name: "优惠券",
  414. type: 'coupon',
  415. data: [],
  416. ratio: 0,
  417. }],
  418. }],//奖励内容
  419. rechargeType: [
  420. {
  421. value: 0,
  422. label: '优惠券'
  423. },
  424. {
  425. value: 1,
  426. label: '余额'
  427. },
  428. {
  429. value: 2,
  430. label: '积分'
  431. },
  432. {
  433. value: 3,
  434. label: '收入'
  435. },
  436. {
  437. value: 4,
  438. label: '激活红包'
  439. },
  440. {
  441. value: 5,
  442. label: '冻结红包'
  443. },
  444. ],
  445. typeArr: ['coupon','balance','score','commission', 'redpack', 'frozen_redpack'], //跟rechargeType对应
  446. couponPop: false,
  447. couponPopIndex: -1,
  448. rules: {
  449. title: [
  450. { required: true, message: '活动名称不能为空', trigger: 'blur' },
  451. { min: 1, max: 12, message: '长度在 1 到 12 个字符', trigger: 'blur' }
  452. ],
  453. dataTime: [{ required: true, message: '活动时间不能为空', trigger: 'blur' }],
  454. },
  455. subLoading: false,
  456. selCoupon: [],//打开优惠券弹窗传递已选中的优惠券
  457. pickerOptions: {
  458. shortcuts: [{
  459. text: '7天',
  460. onClick(picker) {
  461. const end = new Date();
  462. const start = new Date();
  463. end.setTime(end.getTime() + 3600 * 1000 * 24 * 7);
  464. picker.$emit('pick', [start, end]);
  465. }
  466. }, {
  467. text: '15天',
  468. onClick(picker) {
  469. const end = new Date();
  470. const start = new Date();
  471. end.setTime(end.getTime() + 3600 * 1000 * 24 * 15);
  472. picker.$emit('pick', [start, end]);
  473. }
  474. }, {
  475. text: '30天',
  476. onClick(picker) {
  477. const end = new Date();
  478. const start = new Date();
  479. end.setTime(end.getTime() + 3600 * 1000 * 24 * 30);
  480. picker.$emit('pick', [start, end]);
  481. }
  482. }]
  483. },
  484. is_forever:false,
  485. forever_time:3093527951999,
  486. isDisabled:false,
  487. goodsCategoryDialogVisible: false,
  488. searchData: {
  489. id: '',
  490. name: '',
  491. },
  492. listLoading: false,
  493. categoryList: [],
  494. categoryCurrPage: 1,
  495. cateInfo: {},
  496. }
  497. },
  498. created(){
  499. if (getQuery('id') && getQuery('id') != 0) {
  500. this.id = getQuery('id');
  501. }
  502. this.getDetail();
  503. },
  504. methods: {
  505. // 获取充值信息
  506. getDetail(){
  507. request({
  508. params: {
  509. r: 'rebate/index/edit',
  510. id: this.id,
  511. },
  512. method: 'get',
  513. }).then(res => {
  514. console.info(res);
  515. if(res.data.code == 0){
  516. if(res.data.data.detail) {
  517. this.formData = res.data.data.detail;
  518. console.log('====>', this.formData);
  519. this.rewardInfo = res.data.data.detail.reward_info;
  520. this.$set(this.formData, 'dataTime', [new Date(res.data.data.detail.start_at * 1000),new Date(res.data.data.detail.end_at * 1000)]);
  521. if(this.formData.end_at==this.forever_time){
  522. this.isDisabled=true;
  523. this.is_forever =true;
  524. }
  525. if (this.formData.reward_threshold == 0) {
  526. this.formData.reward_threshold = undefined
  527. }
  528. }
  529. if(this.formData.join_type==1){
  530. this.level_arr =res.data.data.rebate_user_level_arr;
  531. }else{
  532. this.level_arr = res.data.data.level_arr;
  533. }
  534. this.user_level_arr = res.data.data.level_arr;
  535. this.rebate_user_level_arr = res.data.data.rebate_user_level_arr;
  536. }
  537. })
  538. },
  539. // 选择商品
  540. goodsSelect(param) {
  541. let item = param;
  542. this.formData.item_id = item.id;
  543. this.formData.item_info.push({
  544. id: item.id,
  545. name: item.goods_name,
  546. price: item.price,
  547. cover_pic: item.cover_pic,
  548. stock: item.stock,
  549. });
  550. },
  551. // 删除商品
  552. deleteGoods(index) {
  553. this.formData.item_info.splice(index, 1);
  554. this.formData.item_id = 0;
  555. },
  556. // 添加奖励条件
  557. addAward(index){
  558. let key = 0;
  559. for(let i = 0;i<this.rechargeType.length;i++){
  560. let dataIndex = this.rewardInfo[index].data.findIndex(v => v.key == this.rechargeType[i].value);
  561. if(dataIndex == -1){
  562. key = i + key;
  563. break;
  564. }
  565. }
  566. let obj = {
  567. key,
  568. name: this.rechargeType[key].label,
  569. type: this.typeArr[key],
  570. data: key == 0?[]:"",
  571. ratio: 0,
  572. }
  573. if(key != 0){
  574. obj.data = 0;
  575. }
  576. this.rewardInfo[index].data.push(obj);
  577. },
  578. // 删除奖励条件
  579. delAward(key,index){
  580. let couponIndex = this.rewardInfo[index].data.findIndex(v => v.key == key);
  581. this.rewardInfo[index].data.splice(couponIndex,1);
  582. },
  583. // 打开优惠券弹窗
  584. openCouponPop(index){
  585. if (this.has_coupon == false) {
  586. this.$message.error("请安装优惠券插件");
  587. return;
  588. }
  589. this.couponPopIndex = index;
  590. let dataIndex = this.rewardInfo[index].data.findIndex(v => v.type == 'coupon');
  591. this.selCoupon = this.rewardInfo[index].data[dataIndex].data;
  592. this.couponPop = true;
  593. },
  594. showCoupon(){
  595. this.couponPopIndex = -1;
  596. this.couponPop = false;
  597. },
  598. //弹窗确定
  599. determine(arr) {
  600. let couponPopData = this.rewardInfo[this.couponPopIndex].data;
  601. let couponIndex = couponPopData.findIndex(v => v.key == 0);
  602. if(couponIndex != -1){
  603. this.rewardInfo[this.couponPopIndex].data[couponIndex].data = arr;
  604. }
  605. this.couponPop = false;
  606. },
  607. // 删除优惠券
  608. delCoupon(selCouponIndex,index){
  609. let couponPopData = this.rewardInfo[index].data;
  610. let couponIndex = couponPopData.findIndex(v => v.key == 0);
  611. if(couponIndex != -1){
  612. this.rewardInfo[index].data[couponIndex].data.splice(selCouponIndex,1);
  613. }
  614. },
  615. // 添加奖励条件
  616. addRewardInfo(){
  617. this.rewardInfo.push({
  618. num: 0,
  619. data: [{
  620. key: 0,
  621. name: "优惠券",
  622. type: 'coupon',
  623. data: [],
  624. ratio: 0
  625. }],
  626. });
  627. },
  628. // 删除奖励条件
  629. deleteReward(index){
  630. this.rewardInfo.splice(index,1);
  631. },
  632. // 切换奖励类型
  633. switchReward(event){
  634. let self = this;
  635. if(event == 1) {
  636. self.rewardTemp2 = self.rewardInfo;
  637. self.rewardInfo = self.rewardTemp1;
  638. } else {
  639. self.rewardTemp1 = self.rewardInfo;
  640. self.rewardInfo = self.rewardTemp2;
  641. }
  642. },
  643. updateTime(val){
  644. if(val){
  645. this.formData.start_at = parseInt(val[0].getTime() / 1000);
  646. this.formData.end_at = parseInt(val[1].getTime() / 1000);
  647. } else {
  648. this.formData.start_at = "";
  649. this.formData.end_at = "";
  650. }
  651. },
  652. // 表单数值验证
  653. validatorInfo(val,index,type = 1,key,couponIndex){
  654. console.info(val,index,type,key,couponIndex);
  655. if(val == ''){
  656. return;
  657. }
  658. let dataIndex = -1;
  659. if(type != 1){
  660. dataIndex = this.rewardInfo[index].data.findIndex(v => v.key == key);
  661. }
  662. if(val <= 0){
  663. if(type == 2){
  664. this.rewardInfo[index].data[dataIndex].data = 0;
  665. } else if(type == 3){
  666. this.rewardInfo[index].data[dataIndex].data[couponIndex].num = 0;
  667. } else {
  668. this.rewardInfo[index].num = 0;
  669. }
  670. return;
  671. }
  672. // 是否能最多保留两位小数
  673. let reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
  674. if(!reg.test(val) && type != 3){
  675. let i = val.indexOf(".") + 3;
  676. val = val.substr(0,i)
  677. if(type == 2){
  678. this.rewardInfo[index].data[dataIndex].data = val;
  679. } else {
  680. this.rewardInfo[index].num = val;
  681. }
  682. }
  683. if(type == 3){
  684. // total_count
  685. val = parseInt(val);
  686. let totalCount = this.rewardInfo[index].data[dataIndex].data[couponIndex].total_count;
  687. if(totalCount < val && totalCount != -1){
  688. this.rewardInfo[index].data[dataIndex].data[couponIndex].num = totalCount;
  689. } else {
  690. this.rewardInfo[index].data[dataIndex].data[couponIndex].num = val;
  691. }
  692. }
  693. },
  694. // 奖励奖励表单严重
  695. validatorForm(){
  696. /* this.rewardInfo.forEach(v => {
  697. if()
  698. }) */
  699. let arr = ['优惠券','余额','积分','收入', '红包'];
  700. for(let i = 0;i<this.rewardInfo.length;i++){
  701. if(this.rewardInfo[i].num <= 0){
  702. return "推荐人数不能小于等于0";
  703. }
  704. if (i > 0 && this.rewardInfo[i].num*1 < this.rewardInfo[i-1].num*1) {
  705. return "推荐人数不能小于前一项";
  706. }
  707. for(let j = 0;j<this.rewardInfo[i].data.length;j++){
  708. if(this.rewardInfo[i].data[j].key == 0){
  709. if(this.rewardInfo[i].data[j].data.length == 0) {
  710. return "请选择奖励内容的优惠券";
  711. }
  712. this.$delete(this.rewardInfo[i].data[j],'ratio');
  713. text = this.validatorCoupon(this.rewardInfo[i].data[j].data);
  714. if(text) return text;
  715. } else {
  716. if(!this.rewardInfo[i].data[j].data || this.rewardInfo[i].data[j].data <= 0){
  717. let value = '值';
  718. if (this.rewardInfo[i].data[j].ratio == 1) {
  719. value='百分比';
  720. }
  721. return "奖励内容的" + arr[this.rewardInfo[i].data[j].key] + value + "不能为空或小于等于0";
  722. }
  723. }
  724. }
  725. }
  726. for(let i = 0;i<this.rewardInfo.length;i++) {
  727. let num = this.rewardInfo[i].num;
  728. let arr = this.rewardInfo.filter(v => v.num == num);
  729. if(arr.length > 1){
  730. return "奖励条件不能重复"
  731. }
  732. }
  733. return "";
  734. },
  735. // 验证优惠券
  736. validatorCoupon(couponList){
  737. for(let i = 0;i<couponList.length;i++){
  738. if(couponList[i].num <= 0){
  739. return "优惠券奖励数量不能小于等于0";
  740. }
  741. }
  742. return "";
  743. },
  744. // 更改奖励内容类型
  745. updateType(key,index,dataIndex){
  746. this.rewardInfo[index].data[dataIndex].name = this.rechargeType[key].label;
  747. this.rewardInfo[index].data[dataIndex].type = this.typeArr[key];
  748. if(key == 0){
  749. this.rewardInfo[index].data[dataIndex].data = [];
  750. } else {
  751. if(Array.isArray(this.rewardInfo[index].data[dataIndex].data)){
  752. this.rewardInfo[index].data[dataIndex].data = 0;
  753. }
  754. }
  755. },
  756. // 保存
  757. submitForm(){
  758. this.formData.title = this.formData.title.toString();
  759. console.log(this.formData,"=>")
  760. this.$refs['formData'].validate((valid) => {
  761. if (valid) {
  762. let text = this.validatorForm();
  763. if(text){
  764. this.$message.error(text);
  765. return;
  766. }
  767. if(!this.formData.id){
  768. if(this.formData.start_at > this.formData.end_at){
  769. this.$message.error('开始时间只能结束时间之后');
  770. return;
  771. }
  772. }
  773. if (this.formData.item_info.length <= 0 && this.formData.cate_info.length <= 0) {
  774. this.$message.error('请选择商品或商品分类');
  775. return;
  776. }
  777. if(this.rewardInfo.length == 0) {
  778. this.$message.error('请选择添加奖励条件');
  779. return;
  780. }
  781. this.$set(this.formData,'reward_info',this.rewardInfo);
  782. this.subLoading = true;
  783. request({
  784. params: {
  785. r: 'rebate/index/edit',
  786. },
  787. method: 'post',
  788. data: this.formData
  789. }).then(res => {
  790. console.info(res);
  791. this.subLoading = false;
  792. if(res.data.code == 0){
  793. this.$message.success("保存成功");
  794. navigateTo({
  795. r: "rebate/index/index"
  796. })
  797. } else {
  798. this.$message.error(res.data.msg);
  799. }
  800. })
  801. }
  802. });
  803. },
  804. changeForever(value){
  805. this.isDisabled=value
  806. if(value==true){
  807. var start_at = new Date().getTime() ; // 1622427445085
  808. this.$set(this.formData, 'dataTime', [new Date(start_at),new Date(this.forever_time * 1000)]);
  809. this.formData.start_at=parseInt(start_at/1000)
  810. this.formData.end_at=this.forever_time
  811. }else{
  812. this.$set(this.formData, 'dataTime', ['','']);
  813. this.formData.start_at=0
  814. this.formData.end_at=0
  815. }
  816. console.log(value)
  817. },
  818. radioGroupJoinType(value){
  819. this.formData.initiate_type = 0;
  820. this.formData.consume_type = 0;
  821. if(value==1){
  822. this.level_arr = this.rebate_user_level_arr;
  823. }else{
  824. this.level_arr = this.user_level_arr;
  825. }
  826. },
  827. getCategory() {
  828. let self = this;
  829. self.listLoading = true;
  830. request({
  831. params: {
  832. r: 'rebate/index/cate-list',
  833. page: self.categoryCurrPage,
  834. ...self.searchData,
  835. },
  836. method: 'get',
  837. }).then(e => {
  838. self.listLoading = false;
  839. if (e.data.code == 0) {
  840. self.categoryList = e.data.data.list.list;
  841. self.categoryCurrPage = e.data.data.list.page_count;
  842. } else {
  843. self.$message.error(e.data.msg);
  844. return false;
  845. }
  846. }).catch(e => {
  847. console.log(e);
  848. self.$message.error('网络错误');
  849. return false;
  850. });
  851. },
  852. getUserClick() {
  853. this.categoryCurrPage = 1;
  854. this.getCategory();
  855. },
  856. // 选择分类
  857. chooseCate() {
  858. this.categoryCurrPage = 1;
  859. this.getCategory();
  860. this.goodsCategoryDialogVisible = true;
  861. },
  862. // 产品分类列表分页
  863. categoryPagination(categoryCurrPage) {
  864. this.categoryCurrPage = categoryCurrPage;
  865. this.getCategory();
  866. },
  867. // 选中分类确定回调
  868. selectCate() {
  869. console.log('selectCate === : ', this.cateInfo);
  870. this.formData.item_id = this.cateInfo.id;
  871. this.goodsCategoryDialogVisible = false;
  872. // this.formData.cateInfo = this.cateInfo;
  873. this.formData.cate_info.push({
  874. id: this.cateInfo.id,
  875. name: this.cateInfo.name,
  876. cover_pic: this.cateInfo.pic,
  877. });
  878. },
  879. clickChange(cateInfo) {
  880. this.cateInfo = cateInfo;
  881. },
  882. // 清楚搜索条件
  883. clearSearch() {
  884. this.searchData.id = '';
  885. this.searchData.name = '';
  886. this.categoryCurrPage = 1;
  887. this.getCategory();
  888. },
  889. //删除分类
  890. deleteCate(index) {
  891. this.formData.cate_info.splice(index, 1);
  892. this.formData.item_id = 0;
  893. },
  894. },
  895. })
  896. </script>
  897. <style>
  898. .el-table_1_column_1 .cell{
  899. display: flex;
  900. align-items: center;
  901. }
  902. .ratio_change {
  903. position: relative;
  904. margin-left: 230px;
  905. margin-bottom: 5px;
  906. }
  907. .button-group {
  908. display: flex;
  909. gap: 10px; /* 可选:设置按钮间距 */
  910. }
  911. .input-item {
  912. display: inline-block;
  913. width: 250px;
  914. margin: 0 0 20px;
  915. }
  916. .input-item .el-input__inner {
  917. border-right: 0;
  918. }
  919. .input-item .el-input__inner:hover {
  920. border: 1px solid #dcdfe6;
  921. border-right: 0;
  922. outline: 0;
  923. }
  924. .input-item .el-input__inner:focus {
  925. border: 1px solid #dcdfe6;
  926. border-right: 0;
  927. outline: 0;
  928. }
  929. .input-item .el-input-group__append {
  930. background-color: #fff;
  931. border-left: 0;
  932. width: 10%;
  933. padding: 0;
  934. }
  935. .input-item .el-input-group__append .el-button {
  936. padding: 0;
  937. }
  938. .input-item .el-input-group__append .el-button {
  939. margin: 0;
  940. }
  941. </style>