-
-
- 优惠券包名称
-
-
-
-
-
-
-
- 类型
-
-
-
-
-
-
-
-
-
-
- 使用归属
-
-
-
-
-
-
-
-
-
- 优惠券包状态
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
共计 {{total}} 条数据
-
-
-
-
- 编号 |
- 优惠券标题 |
- 销售类型 |
- 销售价格 |
- 限购数量 |
- 创建时间 |
- 总库存 |
- 剩余库存 |
- 状态 |
- 操作 |
-
-
-
-
- {{i+1}} |
- {{data.title}} |
- {{data.salesType === 1 ? '售卖' : '赠送'}} |
- {{data.price === null ? '暂无': data.price}} |
- {{data.purchaseNum === null? '暂无': data.purchaseNum}} |
- {{data.createdTime | date: 'yyyy-MM-dd HH:mm'}} |
- {{data.totalStock == null ? 0:data.totalStock }} |
- {{data.surplusStock == null ? 0:data.surplusStock }} |
- {{data.status | discountPackageStatus}} |
-
- 详情
-
- 更多
-
-
-
- |
-
-
-
+
+
共计 {{total}} 条数据
+
+
+
+
+
+
+ 编号 |
+ 优惠券标题 |
+ 销售类型 |
+ 销售价格 |
+ 限购数量 |
+ 创建时间 |
+ 总库存 |
+ 剩余库存 |
+ 状态 |
+ 操作 |
+
+
+
+
+ {{i+1}} |
+ {{data.title}} |
+ {{data.salesType === 1 ? '售卖' : '赠送'}} |
+ {{data.price === null ? '暂无': data.price}} |
+ {{data.purchaseNum === null? '暂无': data.purchaseNum}} |
+ {{data.createdTime | date: 'yyyy-MM-dd HH:mm'}} |
+ {{data.totalStock == null ? 0:data.totalStock }} |
+ {{data.surplusStock == null ? 0:data.surplusStock }} |
+ {{data.status | discountPackageStatus}} |
+
+ 详情
+
+ 更多
+
+
+
+ |
+
+
+
+
@@ -147,3 +148,130 @@
+
+
+
+ 注意:提交赠送时系统会自动过滤 ”有误“ 和 ”重复“ 的数据,有误的数据不会赠送卷包。
+
+
+
+ 序号 |
+ 用户手机号 |
+ 注册状态 |
+ 数据状态 |
+ 错误描述 |
+ 操作 |
+
+
+
+
+ {{data.serialNum}} |
+ {{data.phone}} |
+ {{data.registerStatus?'已注册':'未注册'}} |
+ {{data.errorStatus?'有误':'正常'}} |
+ {{data.errorMsg?data.errorMsg:'无'}} |
+
+ 删除
+ |
+
+
+
+
+
+
+
+
+
+
+
+ 0" nz-typography nzType="danger">注意:导入用户会清空现有列表中的数据。
+
+
+
+ excel文件
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/admin/discount-package/discount-package-list/discount-package-list.component.scss b/src/app/admin/discount-package/discount-package-list/discount-package-list.component.scss
index 63e3f73..eb954d4 100644
--- a/src/app/admin/discount-package/discount-package-list/discount-package-list.component.scss
+++ b/src/app/admin/discount-package/discount-package-list/discount-package-list.component.scss
@@ -1,3 +1,35 @@
.table-td-operation a {
margin-right: 8px;
}
+.ant-advanced-search-form {
+ padding: 24px;
+ background: #fbfbfb;
+ border: 1px solid #d9d9d9;
+ border-radius: 6px;
+ margin-bottom: 10px;
+}
+
+.search-result-list {
+ margin-top: 16px;
+ border: 1px dashed #e9e9e9;
+ border-radius: 6px;
+ background-color: #fafafa;
+ min-height: 200px;
+ text-align: center;
+ padding-top: 80px;
+}
+
+[nz-form-label] {
+ overflow: visible;
+}
+
+button {
+ margin-left: 8px;
+}
+.collapse {
+ margin-left: 8px;
+ font-size: 12px;
+}
+.search-area {
+ text-align: center;
+}
diff --git a/src/app/admin/discount-package/discount-package-list/discount-package-list.component.ts b/src/app/admin/discount-package/discount-package-list/discount-package-list.component.ts
index baf94d2..1f98e47 100644
--- a/src/app/admin/discount-package/discount-package-list/discount-package-list.component.ts
+++ b/src/app/admin/discount-package/discount-package-list/discount-package-list.component.ts
@@ -1,13 +1,14 @@
import { Component, OnInit } from '@angular/core';
import {environment} from '../../../../environments/environment';
-import {FormBuilder, FormGroup} from '@angular/forms';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {CompanyService} from '../../../services/company.service';
import {ActivateService} from '../../../services/activate.service';
import {IconService} from '../../../services/icon.service';
-import {NzMessageService} from 'ng-zorro-antd';
+import {NzMessageService, NzModalService, NzUploadChangeParam} from 'ng-zorro-antd';
import {Router} from '@angular/router';
import {CommonsService} from '../../../services/commons.service';
import {DiscountPackageService} from '../../../services/discount-package.service';
+import {ValidatorsService} from '../../../services/validators.service';
@Component({
selector: 'app-discount-package-list',
@@ -15,7 +16,7 @@ import {DiscountPackageService} from '../../../services/discount-package.service
styleUrls: ['./discount-package-list.component.scss']
})
export class DiscountPackageListComponent implements OnInit {
-
+ BASE_URL = environment.baseUrl;
WEB_SERVE_URL = environment.imageUrl;
searchForm: FormGroup; // 搜索框
requestData = []; // 列表数据
@@ -29,12 +30,32 @@ export class DiscountPackageListComponent implements OnInit {
isVisibleInventory = false;
id: number;
num: number;
+
+ deliverUserAddForm: FormGroup;
+ deliverUserAddModal = false;
+
+ deliverUserSearchForm: FormGroup;
+ deliverUserModal = false;
+ deliverUserArray = [];
+ deliverUserForm: FormGroup;
+ serialNumber: string;
+
+ excelUserModal = false;
+ excelUploadBtn = true;
+ excelUploadFile = [];
+
+ spinObject = {
+ title: '处理中',
+ status: false
+ };
+
constructor(
private form: FormBuilder,
private company: CompanyService,
private activate: ActivateService,
private iconService: IconService,
private message: NzMessageService,
+ private modal: NzModalService,
private router: Router,
private discountPackage: DiscountPackageService,
private commonsService: CommonsService,
@@ -54,6 +75,23 @@ export class DiscountPackageListComponent implements OnInit {
status: [null],
phone: [null],
});
+
+ this.deliverUserSearchForm = this.form.group({
+ phone: [null],
+ registerStatus: [null],
+ errorStatus: [null],
+ });
+
+ this.deliverUserForm = this.form.group({
+ packageId: [null],
+ packageName: [''],
+ phoneArray: [null],
+ });
+
+ this.deliverUserAddForm = this.form.group({
+ phone: [null, [Validators.required, ValidatorsService.mobile]],
+ });
+
this.getRequest(true, this.searchForm.value);
this.commonsService.getDictionary('USING_ATTRIBUTION ', data => {
this.usingAttribution = data['return_data'];
@@ -185,5 +223,156 @@ export class DiscountPackageListComponent implements OnInit {
});
}
+ // 打开 发送优惠券包给用户模态框
+ showDeliverUserModal(packageId: number, packageName: string) {
+ this.deliverUserForm.patchValue({ packageId: packageId, packageName: packageName})
+ this.deliverUserModal = true;
+ }
+
+ // 关闭 发送优惠券包给用户模态框
+ closeDeliverUserModal() {
+ this.deliverUserForm.reset();
+ this.deliverUserModal = false;
+ }
+
+ // 删除赠送用户
+ delDeliverUser(serialNum: number) {
+ this.deliverUserArray = this.deliverUserArray.filter(o => o.serialNum != serialNum);
+ }
+
+ // 展示导入模态框
+ showExcelUserModal() {
+ this.excelUserModal = true;
+ }
+
+ // 关闭导入模态框
+ closeExcelUserModal() {
+ this.excelUploadBtn = true;
+ this.excelUploadFile = [];
+ this.excelUserModal = false;
+ }
+
+ // 提交赠送数据
+ submitDeliverUser() {
+ if (this.deliverUserArray.length == 0) {
+ this.modal.warning({ nzTitle: '提示', nzContent: '没有需要赠送的用户'});
+ }
+ this.deliverUserForm.patchValue({ phoneArray: this.deliverUserArray.filter(o => o.errorStatus == false)});
+ this.spinObject.status = true;
+ this.spinObject.title = '处理中...';
+ this.discountPackage.giveAway(this.deliverUserForm.value, data => {
+ if (data['return_code'] === '000000') {
+ this.serialNumber = data['return_data'];
+ this.closeDeliverUserModal();
+ this.processRate(this.serialNumber);
+ } else {
+ this.message.create('error', data['return_msg']);
+ this.spinObject.status = false;
+ }
+ });
+ }
+
+ // 处理进度
+ processRate(serialNum: string) {
+ this.spinObject.status = true;
+ let time = setInterval(() => this.commonsService.getRedisValueByType(serialNum, data => {
+ if (data['return_data'] != null) {
+ this.spinObject.title = '已处理' + data['return_data'] + '条数据';
+ } else {
+ this.spinObject.status = false;
+ clearTimeout(time);
+ this.getRequest(true, this.searchForm.value);
+ }
+ }), 1000);
+ }
+
+ // 提交excel数据
+ submitExcelUser() {
+ this.discountPackage.getPhoneListByFileUrl({ fileUrl: this.excelUploadFile[0]['url']}, data => {
+ if (data['return_code'] === '000000') {
+ this.deliverUserArray = data['return_data']['data'];
+ this.closeExcelUserModal();
+ } else {
+ this.message.error(data['return_msg']);
+ }
+ });
+ }
+
+ // 上传excel回调
+ excelUserHandleChange(info: NzUploadChangeParam): void {
+ if (info.file.status !== 'uploading') {
+ this.excelUploadFile = [];
+ }
+ if (info.file.status === 'done') {
+ this.excelUploadBtn = false;
+ this.excelUploadFile.push(
+ {
+ uid: '1',
+ name: info.file.name,
+ status: 'done',
+ url: info.file['response']['return_data'][0],
+ thumbUrl: this.WEB_SERVE_URL + info.file['response']['return_data'][0],
+ }
+ )
+ } else if (info.file.status === 'error') {
+ this.message.error('文件上传失败');
+ }
+ }
+
+ // 打开 发送优惠券包给用户模态框
+ showDeliverUserAddModal() {
+ this.deliverUserAddModal = true;
+ }
+
+ // 关闭 发送优惠券包给用户模态框
+ closeDeliverUserAddModal() {
+ this.deliverUserAddForm.reset();
+ this.deliverUserAddModal = false;
+ }
+
+ submitDeliverUserAdd() {
+ for (const i in this.deliverUserAddForm.controls) {
+ this.deliverUserAddForm.controls[i].markAsDirty();
+ this.deliverUserAddForm.controls[i].updateValueAndValidity();
+ }
+ if (this.deliverUserAddForm.status == null || this.deliverUserAddForm.status !== 'VALID') {
+ this.modal.warning({
+ nzTitle: '提示',
+ nzContent: '请规范填写所有的必填项信息',
+ });
+ return;
+ }
+
+ let phoneObject = this.deliverUserArray.find(o => o.phone == this.deliverUserAddForm.controls.phone.value);
+ if (phoneObject != null) {
+ this.modal.warning({
+ nzTitle: '提示',
+ nzContent: '手机号在列表中已存在',
+ });
+ return;
+ }
+
+ this.discountPackage.getPhoneRegisterStatus(this.deliverUserAddForm.value, data => {
+ if (data['return_code'] === '000000') {
+ this.deliverUserArray.push({
+ serialNum: this.deliverUserArray.length + 1,
+ phone: this.deliverUserAddForm.controls.phone.value,
+ registerStatus: data['return_data'],
+ errorStatus: false,
+ errorMsg: null
+ });
+ this.deliverUserArray = this.deliverUserArray.slice();
+ this.closeDeliverUserAddModal();
+ }
+ });
+ }
+
+ // 下载模板
+ downloadTemp() {
+ window.location.href = this.WEB_SERVE_URL + 'template/导入模板.xlsx';
+ }
+
}
+
+
diff --git a/src/app/services/commons.service.ts b/src/app/services/commons.service.ts
index e6b2348..87e9a75 100644
--- a/src/app/services/commons.service.ts
+++ b/src/app/services/commons.service.ts
@@ -183,12 +183,24 @@ export class CommonsService {
* @param codeType 页码
* @param callback 回调
*/
- public getDictionary(codeType: string , callback): any {
- this.http.get(environment.baseUrl + '/common/getDictionaryByCodeType?codeType=' + codeType).subscribe( data => {
+ public getRedisValueByType(key: string , callback): any {
+ this.http.get(environment.baseUrl + '/common/getRedisValueByType?key=' + key).subscribe( data => {
callback(data);
});
}
+ /**
+ * 根据数据类型查询数据字典
+ *
+ * @param codeType 页码
+ * @param callback 回调
+ */
+ public getDictionary(codeType: string , callback): any {
+ this.http.get(environment.baseUrl + '/common/getDictionaryByCodeType?codeType=' + codeType).subscribe( data => {
+ callback(data);
+ });
+ }
+
public mappingSysNameOl(codeType: string , callback): any {
this.http.get(environment.baseUrl + '/common/getDictionaryByCodeTypeOl?codeType=' + codeType).subscribe( data => {
callback(data);
diff --git a/src/app/services/discount-package.service.ts b/src/app/services/discount-package.service.ts
index ef3d328..c33f233 100644
--- a/src/app/services/discount-package.service.ts
+++ b/src/app/services/discount-package.service.ts
@@ -193,5 +193,23 @@ export class DiscountPackageService {
});
}
+ public getPhoneListByFileUrl(paramsObject: object, callBack) {
+ this.http.post(environment.baseUrl + 'highDiscountPackage/getPhoneListByFileUrl', paramsObject).subscribe(data => {
+ callBack(data);
+ });
+ }
+
+ public getPhoneRegisterStatus(paramsObject: object, callBack) {
+ this.http.post(environment.baseUrl + 'highDiscountPackage/getPhoneRegisterStatus', paramsObject).subscribe(data => {
+ callBack(data);
+ });
+ }
+
+ public giveAway(paramsObject: object, callBack) {
+ this.http.post(environment.baseUrl + 'highDiscountPackage/giveAway', paramsObject).subscribe(data => {
+ callBack(data);
+ });
+ }
+
}