精华内容
下载资源
问答
  • 高级定价中的促销和优惠代码

    千次阅读 2016-04-23 00:44:41
    高级定价中的促销和优惠代码在大多数公司中,客户维持率是成功的一个重要标准。公司应用多种策略来留住客户。一个最常见的词是折扣。在市场中,客户总是寻找更好的产品和价格竞争。在零售公司的世界中,在特价方面...

    高级定价中的促销和优惠券代码

    在大多数公司中,客户维持率是成功的一个重要标准。公司应用多种策略来留住客户。一个最常见的词是折扣。在市场中,客户总是寻找更好的产品和价格竞争。在零售公司的世界中,在特价方面听说优惠券代码和促销商品再常见不过了。本文将讨论Oracle高级定价是如何帮助应用这些业务策略,并与关键的电子商务应用集成。
    在定价上下文中,一个订购的项目上的折扣(基于数量、总订单价格或价格范围打折)是EBS平台上客户最常见的需求。一个典型的促销手段将被详细地讨论:当购买X项目时,在Y项目上提供一个折扣。在高级定价中,我们可以利用用多种方式,多种“促销”类型来满足这个需求。这种情形需要如下配置。


    这种情形下,你需要配置的修改量类型是“促销商品”。通过提供产品的属性和值,你可以给出主要项目详细信息。你可以看到这个修改量类型中“定义详细信息”按钮是可用的。窗口中,你可以定义折扣条件。在产品区域你可以列出额外的产品,客户为了让其它的项目免费必须购买它。在“获得”区域,你可以提供额外的项目,可以在它上面应用折扣。本例中应用的折扣是100%,应用方法是“百分比”。对于电子商务平台(即Istore应用程序),高级定价集成地不错。在这些应用程序中,定价应用有很多内置的智能可以使用。在Istore中,客户可以寻求折扣,如果修改量是自动的,折扣就自动应用。同样地,如果修改量设置为手动,客户可以在寻求折扣时,输入促销代码。这里关键的设置是修改量头的高级页签中选中“寻求”框。

    一旦销售订单被创建,并且主要项目被输入到行,那么由于修改量是自动的,所以额外的项目(被定义了100%折扣)被添加到销售订单中。截图展示了行层修改量被自动应用。


    并且,基于你的业务情形,你可以应用不同的修改量来满足折扣条件。维持客户的另一个策略是他们购买了指定量的项目,通过发行优惠券为他们将来的订单提供折扣。这些优惠券可以应用到下一个订单中,直到过期。配置如下:


    优惠券代码这个情况中,修改量类型也是“促销”。有两行需要被添加来发行优惠券。一个是“折扣”标准,即应用方法和应用层次。第二行是“优惠券发行”类型,将会和上面的折扣行绑定(使用修改量编号)。这种情形可以添加典型的修改量,如“客户”或 “一次总付”来发行优惠券。现在我们看看在订单层上优惠券是如何发行的。
    继续之前的例子,一旦订单被登记,优惠券在头层自动发行到客户,也可以从查看价格调整中看到。你也可以这些地方看到订单应用的促销折扣。优惠券可以是基于数量或价格的,并且不同业务需求可以应用不同的修改量。

    一旦发行了优惠券,相应的客户可以在下个订单中使用它。在订单头点击“活动”可以调用“促销/价格属性”。折扣将被应用到订单层。
    高级定价可以在促销和优惠券代码部分帮助迎合不同的策略。基于促销需求的合适的配置可以帮助达到复杂的业务需求。
    展开全文
  • 以下是最近实现的优惠券活动,主要的业务需求:根据后端设置优惠券模板,用户类型设置,优惠券活动的开始与结束时间,最后生成不同的优惠券活动链接。 代码环境: 源码主要laravel5.8,一整个活动要贴的代码很多,...
  • 天池 O2O 优惠券使用预测思路解析与代码实战

    万次阅读 多人点赞 2018-11-08 13:37:33
    然后就了解到最近热度很高且非常适合新人入门的一场比赛:天池新人实战赛o2o优惠券使用预测。今天,红色石头把这场比赛的一些初级理论分析和代码实操分享给大家。本文会讲解的很细,目的是带领大家走一遍比赛流程,...

    个人网站:redstonewill.com

    前阵子因为机器学习训练营的任务安排,需要打一场 AI 比赛。然后就了解到最近热度很高且非常适合新人入门的一场比赛:天池新人实战赛o2o优惠券使用预测。今天,红色石头把这场比赛的一些初级理论分析和代码实操分享给大家。本文会讲解的很细,目的是带领大家走一遍比赛流程,实现机器学习理论分析到比赛实战的进阶。话不多说,我们开始吧!

    比赛介绍

    首先附上这场比赛的链接:

    https://tianchi.aliyun.com/getStart/introduction.htm?spm=5176.100066.0.0.518433afBqXIKM&raceId=231593

    本赛题的比赛背景是随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以 O2O(Online to Offline)消费最为吸引眼球。本次大赛为参赛选手提供了 O2O 场景相关的丰富数据,希望参赛选手通过分析建模,精准预测用户是否会在规定时间(15 天)内使用相应优惠券。

    从机器学习模型的角度来说,这是一个典型的分类问题,其过程就是根据已有训练集进行训练,得到的模型再对测试进行测试并分类。整个过程如下图所示:

    在这里插入图片描述

    评估方式

    我们知道评估一个机器学习模型有多种方式,最常见的例如准确率(Accuracy)、精确率(Precision)、召回率(Recall)。一般使用精确率和召回率结合的方式 F1 score 能较好地评估模型性能(特别是在正负样本不平衡的情况下)。而在本赛题,官方规定的评估方式是 AUC,即 ROC 曲线与横坐标围成的面积。如下图所示:

    在这里插入图片描述

    关于 ROC 和 AUC 的概念这里不加解释,至于为什么要使用 ROC 和 AUC 呢?因为 ROC 曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。也就是说能够更好地处理正负样本分布不均的场景。

    数据集导入

    对任何机器学习模型来说,数据集永远是最重要的。接下来,我们就来看看这个比赛的数据集是什么样的。

    首先来看一下大赛提供给我们的数据集:

    在这里插入图片描述

    总共有四个文件,分别是:

    • ccf_offline_stage1_test_revised.csv

    • ccf_offline_stage1_train.csv

    • ccf_online_stage1_train.csv

    • sample_submission.csv

    其中,第 2 个是线下训练集,第 1 个是线下测试集,第 3 个是线上训练集(本文不会用到),第 4 个是预测结果提交到官网的文件格式(需按照此格式提交才有效)。也就是说我们使用第 2 个文件来训练模型,对第 1 个文件进行预测,得到用户在 15 天内使用优惠券的概率值。

    接下来,对 2、1、4 文件中字段进行列举,字段解释如下图所示。

    ccf_offline_stage1_train.csv:

    在这里插入图片描述

    ccf_offline_stage1_test_revised.csv:

    在这里插入图片描述

    sample_submission.csv:

    在这里插入图片描述

    重点记住两个字段:Date_received 是领取优惠券日期,Date 是消费日期。待会我将详细介绍。

    介绍完几个数据文件和字段之后,我们就来编写程序,导入训练集和测试集,同时导入需要用到的库。

    # import libraries necessary for this project
    import os, sys, pickle
    
    import numpy as np
    import pandas as pd
    
    from datetime import date
    
    from sklearn.model_selection import KFold, train_test_split, StratifiedKFold, cross_val_score, GridSearchCV
    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import SGDClassifier, LogisticRegression
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import log_loss, roc_auc_score, auc, roc_curve
    from sklearn.preprocessing import MinMaxScaler
    
    # display for this notebook
    %matplotlib inline
    %config InlineBackend.figure_format = 'retina'
    

    导入数据:

    dfoff = pd.read_csv('data/ccf_offline_stage1_train.csv')
    dfon = pd.read_csv('data/ccf_online_stage1_train.csv')
    dftest = pd.read_csv('data/ccf_offline_stage1_test_revised.csv')
    
    dfoff.head(5)
    

    是训练集前 5 行显示如下:

    在这里插入图片描述

    接下来,我们来做个简单统计,看一看究竟用户是否使用优惠券消费的情况。

    print('有优惠卷,购买商品:%d' % dfoff[(dfoff['Date_received'] != 'null') & (dfoff['Date'] != 'null')].shape[0])
    print('有优惠卷,未购商品:%d' % dfoff[(dfoff['Date_received'] != 'null') & (dfoff['Date'] == 'null')].shape[0])
    print('无优惠卷,购买商品:%d' % dfoff[(dfoff['Date_received'] == 'null') & (dfoff['Date'] != 'null')].shape[0])
    print('无优惠卷,未购商品:%d' % dfoff[(dfoff['Date_received'] == 'null') & (dfoff['Date'] == 'null')].shape[0])
    

    有优惠卷,购买商品:75382
    有优惠卷,未购商品:977900
    无优惠卷,购买商品:701602
    无优惠卷,未购商品:0

    可见,很多人(701602)购买商品却没有使用优惠券,也有很多人(977900)有优惠券但却没有使用,真正使用优惠券购买商品的人(75382)很少!所以,这个比赛的意义就是把优惠券送给真正可能会购买商品的人。

    特征提取

    毫不夸张第说,构建机器学习模型,特征工程可能比选择哪种算法更加重要。接下来,我们就来研究一下哪些特征可能对模型训练有用。

    1.打折率(Discount_rate)

    首先,第一个想到的特征应该是优惠卷的打折率。因为很显然,一般情况下优惠得越多,用户就越有可能使用优惠券。那么,我们就来看一下训练集中优惠卷有哪些类型。

    print('Discount_rate 类型:\n',dfoff['Discount_rate'].unique())
    

    Discount_rate 类型:
    [‘null’ ‘150:20’ ‘20:1’ ‘200:20’ ‘30:5’ ‘50:10’ ‘10:5’ ‘100:10’ ‘200:30’ ‘20:5’ >‘30:10’ ‘50:5’ ‘150:10’ ‘100:30’ ‘200:50’ ‘100:50’ ‘300:30’ ‘50:20’ ‘0.9’ ‘10:1’ >‘30:1’ ‘0.95’ ‘100:5’ ‘5:1’ ‘100:20’ ‘0.8’ ‘50:1’ ‘200:10’ ‘300:20’ ‘100:1’ >‘150:30’ ‘300:50’ ‘20:10’ ‘0.85’ ‘0.6’ ‘150:50’ ‘0.75’ ‘0.5’ ‘200:5’ ‘0.7’ >‘30:20’ ‘300:10’ ‘0.2’ ‘50:30’ ‘200:100’ ‘150:5’]

    根据打印的结果来看,打折率分为 3 种情况:

    • ‘null’ 表示没有打折

    • [0,1] 表示折扣率

    • x:y 表示满 x 减 y

    那我们的处理方式可以构建 4 个函数,分别提取 4 种特征,分别是:

    • 打折类型:getDiscountType()

    • 折扣率:convertRate()

    • 满多少:getDiscountMan()

    • 减多少:getDiscountJian()

    函数代码如下:

    # Convert Discount_rate and Distance
    def getDiscountType(row):
       if row == 'null':
           return 'null'
       elif ':' in row:
           return 1
       else:
           return 0
    
    def convertRate(row):
       """Convert discount to rate"""
       if row == 'null':
           return 1.0
       elif ':' in row:
           rows = row.split(':')
           return 1.0 - float(rows[1])/float(rows[0])
       else:
           return float(row)
       
    def getDiscountMan(row):
       if ':' in row:
           rows = row.split(':')
           return int(rows[0])
       else:
           return 0
    
    def getDiscountJian(row):
       if ':' in row:
           rows = row.split(':')
           return int(rows[1])
       else:
           return 0
       
    def processData(df):
       
       # convert discount_rate
       df['discount_type'] = df['Discount_rate'].apply(getDiscountType)
       df['discount_rate'] = df['Discount_rate'].apply(convertRate)
       df['discount_man'] = df['Discount_rate'].apply(getDiscountMan)
       df['discount_jian'] = df['Discount_rate'].apply(getDiscountJian)
       
       print(df['discount_rate'].unique())
       
       return df
    

    然后,对训练集和测试集分别进行进行 processData()函数的处理:

    dfoff = processData(dfoff)
    dftest = processData(dftest)
    

    处理之后,我们可以看到训练集和测试集都多出了 4 个新的特征:discount_type、discount_rate、discount_man、discount_jian。

    在这里插入图片描述

    2.距离(Distance)

    距离字段表示用户与商店的地理距离,显然,距离的远近也会影响到优惠券的使用与否。那么,我们就可以把距离也作为一个特征。首先看一下距离有哪些特征值:

    print('Distance 类型:',dfoff['Distance'].unique())
    

    Distance 类型: [‘0’ ‘1’ ‘null’ ‘2’ ‘10’ ‘4’ ‘7’ ‘9’ ‘3’ ‘5’ ‘6’ ‘8’]

    然后,定义提取距离特征的函数:

    # convert distance
    dfoff['distance'] = dfoff['Distance'].replace('null', -1).astype(int)
    print(dfoff['distance'].unique())
    dftest['distance'] = dftest['Distance'].replace('null', -1).astype(int)
    print(dftest['distance'].unique())
    

    处理之后,我们可以看到训练集和测试集都多出了 1 个新的特征:distance。

    在这里插入图片描述

    3.领劵日期(Date_received)

    是还有一点很重要的是领券日期,因为一般而言,周末领取优惠券去消费的可能性更大一些。因此,我们可以构建关于领券日期的一些特征:

    • weekday : {null, 1, 2, 3, 4, 5, 6, 7}

    • weekday_type : {1, 0}(周六和周日为1,其他为0)

    • Weekday_1 : {1, 0, 0, 0, 0, 0, 0}

    • Weekday_2 : {0, 1, 0, 0, 0, 0, 0}

    • Weekday_3 : {0, 0, 1, 0, 0, 0, 0}

    • Weekday_4 : {0, 0, 0, 1, 0, 0, 0}

    • Weekday_5 : {0, 0, 0, 0, 1, 0, 0}

    • Weekday_6 : {0, 0, 0, 0, 0, 1, 0}

    • Weekday_7 : {0, 0, 0, 0, 0, 0, 1}

    其中用到了独热编码,让特征更加丰富。相应的这 9 个特征的提取函数为:

    def getWeekday(row):
       if row == 'null':
           return row
       else:
           return date(int(row[0:4]), int(row[4:6]), int(row[6:8])).weekday() + 1
    
    dfoff['weekday'] = dfoff['Date_received'].astype(str).apply(getWeekday)
    dftest['weekday'] = dftest['Date_received'].astype(str).apply(getWeekday)
    
    # weekday_type :  周六和周日为1,其他为0
    dfoff['weekday_type'] = dfoff['weekday'].apply(lambda x: 1 if x in [6,7] else 0)
    dftest['weekday_type'] = dftest['weekday'].apply(lambda x: 1 if x in [6,7] else 0)
    
    # change weekday to one-hot encoding 
    weekdaycols = ['weekday_' + str(i) for i in range(1,8)]
    #print(weekdaycols)
    
    tmpdf = pd.get_dummies(dfoff['weekday'].replace('null', np.nan))
    tmpdf.columns = weekdaycols
    dfoff[weekdaycols] = tmpdf
    
    tmpdf = pd.get_dummies(dftest['weekday'].replace('null', np.nan))
    tmpdf.columns = weekdaycols
    dftest[weekdaycols] = tmpdf
    

    这样,我们就会在训练集和测试集上发现增加了 9 个关于领券日期的特征:

    在这里插入图片描述

    好了,经过以上简单的特征提取,我们总共得到了 14 个有用的特征:

    • discount_rate

    • discount_type

    • discount_man

    • discount_jian

    • distance

    • weekday

    • weekday_type

    • weekday_1

    • weekday_2

    • weekday_3

    • weekday_4

    • weekday_5

    • weekday_6

    • weekday_7

    好了,我们的主要工作已经完成了大半!

    标注标签 Label

    有了特征之后,我们还需要对训练样本进行 label 标注,即确定哪些是正样本(y = 1),哪些是负样本(y = 0)。我们要预测的是用户在领取优惠券之后 15 之内的消费情况。所以,总共有三种情况:

    1.Date_received == ‘null’:

    表示没有领到优惠券,无需考虑,y = -1

    2.(Date_received != ‘null’) & (Date != ‘null’) & (Date - Date_received <= 15):

    表示领取优惠券且在15天内使用,即正样本,y = 1

    3.(Date_received != ‘null’) & ((Date == ‘null’) | (Date - Date_received > 15)):

    表示领取优惠券未在在15天内使用,即负样本,y = 0

    好了,知道规则之后,我们就可以定义标签备注函数了。

    def label(row):
       if row['Date_received'] == 'null':
           return -1
       if row['Date'] != 'null':
           td = pd.to_datetime(row['Date'], format='%Y%m%d') - pd.to_datetime(row['Date_received'], format='%Y%m%d')
           if td <= pd.Timedelta(15, 'D'):
               return 1
       return 0
    
    dfoff['label'] = dfoff.apply(label, axis=1)
    

    我们可以使用这个函数对训练集进行标注,看一下正负样本究竟有多少:

    print(dfoff['label'].value_counts())
    

    0 988887
    -1 701602
    1 64395
    Name: label, dtype: int64

    很清晰地,正样本共有 64395 例,负样本共有 988887 例。显然,正负样本数量差别很大。这也是为什么会使用 AUC 作为模型性能评估标准的原因。

    建立模型

    接下来就是最主要的建立机器学习模型了。首先确定的是我们选择的特征是上面提取的 14 个特征,为了验证模型的性能,需要划分验证集进行模型验证,划分方式是按照领券日期,即训练集:20160101-20160515,验证集:20160516-20160615。我们采用的模型是简单的 SGDClassifier。

    1.划分训练集和验证集

    # data split
    df = dfoff[dfoff['label'] != -1].copy()
    train = df[(df['Date_received'] < '20160516')].copy()
    valid = df[(df['Date_received'] >= '20160516') & (df['Date_received'] <= '20160615')].copy()
    print('Train Set: \n', train['label'].value_counts())
    print('Valid Set: \n', valid['label'].value_counts())
    

    2.构建模型

    def check_model(data, predictors):
       
       classifier = lambda: SGDClassifier(
           loss='log',  # loss function: logistic regression
           penalty='elasticnet', # L1 & L2
           fit_intercept=True,  # 是否存在截距,默认存在
           max_iter=100, 
           shuffle=True,  # Whether or not the training data should be shuffled after each epoch
           n_jobs=1, # The number of processors to use
           class_weight=None) # Weights associated with classes. If not given, all classes are supposed to have weight one.
    
       # 管道机制使得参数集在新数据集(比如测试集)上的重复使用,管道机制实现了对全部步骤的流式化封装和管理。
       model = Pipeline(steps=[
           ('ss', StandardScaler()), # transformer
           ('en', classifier())  # estimator
       ])
    
       parameters = {
           'en__alpha': [ 0.001, 0.01, 0.1],
           'en__l1_ratio': [ 0.001, 0.01, 0.1]
       }
    
       # StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。
       folder = StratifiedKFold(n_splits=3, shuffle=True)
       
       # Exhaustive search over specified parameter values for an estimator.
       grid_search = GridSearchCV(
           model, 
           parameters, 
           cv=folder, 
           n_jobs=-1,  # -1 means using all processors
           verbose=1)
       grid_search = grid_search.fit(data[predictors], 
                                     data['label'])
       
       return grid_search
    

    模型采用的是 SGDClassifier,使用了 Python 中的 Pipeline 管道机制,可以使参数集在新数据集(比如测试集)上的重复使用,管道机制实现了对全部步骤的流式化封装和管理。交叉验证采用 StratifiedKFold,其用法类似 Kfold,但是 StratifiedKFold 是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。

    3.训练

    接下来就可以使用该模型对训练集进行训练了,整个训练过程大概 1-2 分钟的时间。

    predictors = original_feature
    model = check_model(train, predictors)
    

    4.验证

    然后对验证集中每个优惠券预测的结果计算 AUC,再对所有优惠券的 AUC 求平均。计算 AUC 的时候,如果 label 只有一类,就直接跳过,因为 AUC 无法计算。

    # valid predict
    y_valid_pred = model.predict_proba(valid[predictors])
    valid1 = valid.copy()
    valid1['pred_prob'] = y_valid_pred[:, 1]
    valid1.head(5)
    

    注意这里得到的结果 pred_prob 是概率值(预测样本属于正类的概率)。

    最后,就可以对验证集计算 AUC。直接调用 sklearn 库自带的计算 AUC 函数即可。

    # avgAUC calculation
    vg = valid1.groupby(['Coupon_id'])
    aucs = []
    for i in vg:
       tmpdf = i[1] 
       if len(tmpdf['label'].unique()) != 2:
           continue
       fpr, tpr, thresholds = roc_curve(tmpdf['label'], tmpdf['pred_prob'], pos_label=1)
       aucs.append(auc(fpr, tpr))
    print(np.average(aucs))
    

    0.532344469452

    最终得到的 AUC 就等于 0.53。

    测试

    训练完模型之后,就是使用训练好的模型对测试集进行测试了。并且将测试得到的结果(概率值)按照规定的格式保存成一个 .csv 文件。

    # test prediction for submission
    y_test_pred = model.predict_proba(dftest[predictors])
    dftest1 = dftest[['User_id','Coupon_id','Date_received']].copy()
    dftest1['Probability'] = y_test_pred[:,1]
    dftest1.to_csv('submit.csv', index=False, header=False)
    dftest1.head(5)
    

    值得注意的是,这里得到的结果是概率值,最终的 AUC 是提交到官网之后平台计算的。因为测试集真正的 label 我们肯定是不知道的。

    提交结果

    好了,最后一步就是在比赛官网上提交我们的预测结果,即这里的 submit.csv 文件。提交完之后,过几个小时就可以看到成绩了。整个比赛的流程就完成了。

    优化模型

    其实,本文所述的整个比赛思路和算法是比较简单的,得到的结果和成绩也只能算是合格,名次不会很高。我们还可以运用各种手段优化模型,简单来说分为以下三种:

    • 特征工程

    • 机器学习

    • 模型融合

    总结

    本文的主要目的是带领大家走一遍整个比赛的流程,培养一些比赛中特征提取和算法应用方面的知识。这个天池比赛目前还是比较火热的,虽然没有奖金,但是参赛人数已经超过 1.1w 了。看完本文之后,希望大家有时间去参加感受一下机器学习比赛的氛围,将理论应用到实战中去。

    本文完整的代码我已经放在了 GitHub 上,有需要的请自行领取:

    https://github.com/RedstoneWill/MachineLearningInAction-Camp/tree/master/Week4/o2o%20Code_Easy

    同时,本比赛第一名的代码也开源了,一同放出,供大家学习:

    https://github.com/wepe/O2O-Coupon-Usage-Forecast


    在这里插入图片描述

    展开全文
  • 优惠券制作和分配(含代码)

    千次阅读 2014-05-29 14:55:31
    优惠券制作和分配

    优惠券制作和分配

    一、制作:

    import java.math.BigDecimal;
    import java.util.Date;
    
    /**
     * 优惠券详细信息
     * @author hzh
     *
     */
    public class CouponDetail {
    
    	//优惠券类型ID
    	private int typeId;
    	//优惠劵面值
    	private BigDecimal faceValue ;
    	//优惠券名称
    	private String couponName ;
    	
    	//数据库时间歘
    	private Date timestamp ;
    	
    	
    	public int getTypeId() {
    		return typeId;
    	}
    	public void setTypeId(int typeId) {
    		this.typeId = typeId;
    	}
    	public BigDecimal getFaceValue() {
    		return faceValue;
    	}
    	public void setFaceValue(BigDecimal faceValue) {
    		this.faceValue = faceValue;
    	}
    	public String getCouponName() {
    		return couponName;
    	}
    	public void setCouponName(String couponName) {
    		this.couponName = couponName;
    	}
    	public Date getTimestamp() {
    		return timestamp;
    	}
    	public void setTimestamp(Date timestamp) {
    		this.timestamp = timestamp;
    	}
    	
    	
    	
    }
    



    /**
     * 优惠券
     * @author hzh
     *
     */
    
    public class Coupon {
    	//优惠劵ID
    	private Long couponId;
    	//优惠劵面值
    	private BigDecimal faceValue ;
    	//制作人ID
    	private Long founderId ;
    	//分配人ID
    	private Long assignerId ;
    	//用户ID
    	private Long userId ;
    	//优惠劵类型
    	private int couponType ;
    	//制作时间
    	private Date createDate ;	
    	//分配时间
    	private Date assignDate ;
    	//状态
    	private int status ;
    	//使用此优惠劵的交易ID
    	private long employId ;
    	//使用时间
    	private Date employDate ;
    	
    	
    	
    	//数据库时间戳
    	private Date timestamp ;
    
    
    
    	/**
    	 * 后台到页面
    	 * 
    	 */
    
    	//制作人用户名
    	private String createUserName ;
    	//分配人用户名
    	private String assignUserName;
    	//被分配用户名
    	private String userName ;
    	//优惠劵名称
    	private String couponName ;
    	//数量
    	private long number ;
    	//可抵消总金额
    	private BigDecimal totalFee ;
    	
    	
    	
    
    
    
    
    
    	public BigDecimal getTotalFee() {
    		
    		return faceValue.multiply(BigDecimal.valueOf(number));
    	}
    
    
    
    	public void setTotalFee(BigDecimal totalFee) {
    		this.totalFee = totalFee;
    	}
    
    
    
    
    
    
    	public Long getCouponId() {
    		return couponId;
    	}
    
    
    
    	public void setCouponId(Long couponId) {
    		this.couponId = couponId;
    	}
    
    
    
    	public BigDecimal getFaceValue() {
    		return faceValue;
    	}
    
    
    
    	public void setFaceValue(BigDecimal faceValue) {
    		this.faceValue = faceValue;
    	}
    
    
    
    	public Long getFounderId() {
    		return founderId;
    	}
    
    
    
    	public void setFounderId(Long founderId) {
    		this.founderId = founderId;
    	}
    
    
    
    	public Long getAssignerId() {
    		return assignerId;
    	}
    
    
    
    	public void setAssignerId(Long assignerId) {
    		this.assignerId = assignerId;
    	}
    
    
    
    	public Long getUserId() {
    		return userId;
    	}
    
    
    
    	public void setUserId(Long userId) {
    		this.userId = userId;
    	}
    
    
    
    	public int getCouponType() {
    		return couponType;
    	}
    
    
    
    	public void setCouponType(int couponType) {
    		this.couponType = couponType;
    	}
    
    
    
    	public Date getCreateDate() {
    		return createDate;
    	}
    
    
    
    	public void setCreateDate(Date createDate) {
    		this.createDate = createDate;
    	}
    
    
    
    	public Date getAssignDate() {
    		return assignDate;
    	}
    
    
    
    	public void setAssignDate(Date assignDate) {
    		this.assignDate = assignDate;
    	}
    
    
    
    	public int getStatus() {
    		return status;
    	}
    
    
    
    	public void setStatus(int status) {
    		this.status = status;
    	}
    
    
    
    	public Date getTimestamp() {
    		return timestamp;
    	}
    
    
    
    	public void setTimestamp(Date timestamp) {
    		this.timestamp = timestamp;
    	}
    
    
    
    	
    	
    
    
    
    	public String getCreateUserName() {
    		return createUserName;
    	}
    
    
    
    	public void setCreateUserName(String createUserName) {
    		this.createUserName = createUserName;
    	}
    
    
    
    	public String getAssignUserName() {
    		return assignUserName;
    	}
    
    
    
    	public void setAssignUserName(String assignUserName) {
    		this.assignUserName = assignUserName;
    	}
    
    
    
    	public String getUserName() {
    		return userName;
    	}
    
    
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    
    
    	public String getCouponName() {
    		return couponName;
    	}
    
    
    
    	public void setCouponName(String couponName) {
    		this.couponName = couponName;
    	}
    
    
    
    	public long getNumber() {
    		return number;
    	}
    
    
    
    	public void setNumber(long number) {
    		this.number = number;
    	}
    
    
    
    	public long getEmployId() {
    		return employId;
    	}
    
    
    
    	public void setEmployId(long employId) {
    		this.employId = employId;
    	}
    
    
    
    	public Date getEmployDate() {
    		return employDate;
    	}
    
    
    
    	public void setEmployDate(Date employDate) {
    		this.employDate = employDate;
    	}
    		
    	
    }
    
    



    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
    
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    
    import cn.company.bbd.account.model.Coupon;
    import cn.company.bbd.account.model.CouponDetail;
    import cn.company.bbd.account.model.BasicUser;
    
    
    @Controller("CreateCouponBean")
    @Scope("session")
    public class CreateCouponController implements Serializable {
    	/**
    	 * 
    	 */
    
    	private static final Logger log = Logger
    			.getLogger(CreateCouponController.class);
    	
    	//管理员
    	private BasicUser user ;
    	// 优惠劵所有类型
    	private List<CouponDetail> list;
    	// 选择的优惠劵
    	private Coupon coupon = new Coupon();
    	//需制作的优惠劵
    	private List<Coupon> couponList = new ArrayList<Coupon>();
    	// 制作张数
    	private int number;
    	
    	
    
    	@Autowired(required = true)
    	@Qualifier("UserAuthenticationService")
    	private UserAuthenticationService UserAuthenticationService;
    
    	@Autowired(required = true)
    	@Qualifier("AccountService")
    	private AccountService accountService;
    
    	@Autowired(required = true)
    	@Qualifier("IdService")
    	private IdService idService;
    
    	public CreateCouponController() {
    		log.debug("CreateCouponController constructed!");
    	}
    
    	public String submit() {
    		if(validate()){
    			if(null != getList()){
    				for(CouponDetail cd : list){
    					if(cd.getTypeId() == coupon.getCouponType()){
    						for (int i = 0; i < number; i++) {
    							Coupon c = new Coupon();
    							c.setCouponId(IdKit.generateCouponId());
    							c.setFaceValue(cd.getFaceValue());
    							c.setFounderId(getUser().getUserId());
    							c.setCouponType(coupon.getCouponType());
    							c.setCreateDate(new Date());
    							c.setStatus(AccountConstant.COUPON_STATUS_CREATED);
    							couponList.add(c);
    						}
    					}
    				}
    				
    				
    				accountService.createCoupon(couponList);
    				number = 0 ;
    				couponList = new ArrayList<Coupon>();
    				return PageConstant.PG_COUPON_MANAGE;
    			}
    		}
    		return "";
    	}
    
    	private boolean validate() {
    		
    		if (0 == number) {
    			FacesContext.getCurrentInstance().addMessage(
    					null,
    					new FacesMessage(FacesMessage.SEVERITY_ERROR, MessageKit
    							.getMessage("error_coupon_numberNull"), ""));
    			return false;
    		}else if(!RegexKit.patternTest(SecurityConstant.REGEX_PROFILE_NUMBER, String.valueOf(number))){
    			FacesContext.getCurrentInstance().addMessage(
    					null,
    					new FacesMessage(FacesMessage.SEVERITY_ERROR, MessageKit
    							.getMessage("error_coupon_number"), ""));
    			return false;
    		}
    		return true ;
    	}
    
    	public List<CouponDetail> getList() {
    		list = null ;
    		if(null == list){
    			list = accountService.queryAllCouponDetail(); 
    		}
    		return list ;
    	}
    	
    	
    
    	public BasicUser getUser() {
    		if(null == user){
    			user = UserAuthenticationService.getCurrentUser();
    		}
    		return user;
    	}
    
    	public void setCoupon(Coupon coupon) {
    		this.coupon = coupon;
    	}
    
    	public Coupon getCoupon() {
    		return coupon;
    	}
    
    	public void setNumber(int number) {
    		this.number = number;
    	}
    
    	public int getNumber() {
    		return number;
    	}
    
    }
    





    
    展开全文
  • 实现会员管理的会员政策优惠设置功能的代码(二十二) 3.5.3会员政策优惠设置 3.5.3.1会员政策优惠设置主界面 会员政策优惠设置是针对会员来讲的,可能是医院为了感谢会员们的支持或是其它的原因而设置的会员优惠...

    实现会员管理的会员政策优惠设置功能的代码(二十二)

    3.5.3会员政策优惠设置

    3.5.3.1会员政策优惠设置主界面

    会员政策优惠设置是针对会员来讲的,可能是医院为了感谢会员们的支持或是其它的原因而设置的会员优惠,不同的会员类别拥有的优惠是不同的。

    主界面截图:

     

    3.5.3.1(图1

    从界面上可以看到我们这里用到的控件有:

    控件名称

    说明

    按钮控件button

    第一要设置每个控件的Text,第二设置控件Name;不同的是dataGridView右键进行编辑列。

    表格控件dataGridView

    查询功能实现

    第一步:数据库

    1、  表与关系

    3.5.2.1(图2

    1:会员政策优惠表(BT_MembeFavorablePolicyTable)

    列名

    数据类型

    主键/外键

    说明

    MembeFavorablePolicyID

    int - Identity

    主键

    会员政策优惠ID

    MemberCategoryID

    int

    外键

    会员类别 ID

    TreatmentItemID

    int

     

    治疗项目ID

    FavorablePolicy

    nchar (100)

     

    优惠政策

    FreeTime

    nchar (100)

     

    免费次数

    ExecuteMark

    nchar (50)

     

    执行标志

    Remarks

    nchar (200)

     

    备注

    WhetherEffective

    bit

     

    有效否

    2:治疗项目表(BT_TreatmentItemsTable)

    列名

    数据类型

    主键/外键

    说明

    TreatmentItemID

    int - Identity

    主键

    治疗项目ID

    TreatmentItemName

    nchar (50)

     

    治疗项目名称

    AS_ItemTypeID

    int

    外键

    项目类型ID

    ItemNumber

    nchar (30)

     

    项目编号

    TreatmentItemsMedicareNumber

    nchar (30)

     

    治疗项目医保编号

    WhetherMedicare

    bit

     

    医保否

    AS_UserStatusID

    int

    外键

    使用状态ID

    AlphabeticBrevityCode

    nchar (20)

     

    拼音简码

    WubiInCode

    nchar (20)

     

    五笔简码

    ChargeCategoryID

    int

    外键

    收费类别 ID

    MedicineCategoryID

    int

    外键

    医学类别 ID

    PromotionalLogo

    nchar (30)

     

    促销标识

    PhysicalExaminationPricing

    decimal (18, 2)

     

    体检定价

    TotalInvestment

    nchar (20)

     

    项目单位

    GeneralPricing

    decimal (18, 2)

     

    普通定价

    MedicarePricing

    decimal (18, 2)

     

    医保定价

    MemberPrice

    decimal (18, 2)

     

    会员定价

    WhetherIntegral

    bit

     

    积分否

    ProportionIntegral

    decimal (18, 2)

     

    积分比例

    IntegralScores

    decimal (18, 2)

     

    积分分数

    PhysicalExaminationTechnicalOfficesID

    int

    外键

    体检科室ID

    ItemRemarks

    nchar (100)

     

    项目备注

    WhetherPhysicalExaminationItem

    bit

     

    体检项目否

    MedicalApparatusID

    int

    外键

    化验仪器ID

    ItemID

    int

    外键

    项目ID

    WhetherAllowTheFrontDeskToChangePriceSales

    bit

     

    允许前台改价销售否

    WhetherAllowTheFrontDeskDiscountSales

    bit

     

    允许前台折扣销售否

    EntryStaff_StaffID

    int

    外键

    录入人员_员工ID

    EntryDate

    datetime

     

    录入日期

    UpdateStaff_StaffID

    int

    外键

    修改人员_员工ID

    UpdateDate

    datetime

     

    修改日期

    WhetherEffective

    bit

     

    有效否

     

    3:会员类别表(BT_MemberCategoryTable

    列名

    数据类型

    主键/外键

    说明

    MemberCategoryID

    int - Identity

    主键

    会员类别 ID

    MemberCategoryNumber

    nchar (30)

     

    会员类别编号

    MemberCategoryDiscount

    numeric (18, 2)

     

    会员类别折扣

    MemberCategoryName

    nchar (30)

     

    会员类别名称

    Remarks

    nchar (150)

     

    备注

    WhetherEffective

    bit

     

    有效否

    功能代码实现

     

     

    查询会员政策优惠设置

    1)、存储过程代码:

    --查询会员政策优惠设置
    IF(@Type ='FRM_HuiYuanZhengCheYouHuiSheZhi_Load_SelectMembeFavorablePolicy')
    	BEGIN
    		SELECT     LTRIM(RTRIM(BT_MembeFavorablePolicyTable.MembeFavorablePolicyID)) AS MembeFavorablePolicyID, 
    		      LTRIM(RTRIM(BT_MemberCategoryTable.MemberCategoryName)) AS MemberCategoryName, 
    			  LTRIM(RTRIM(BT_TreatmentItemsTable.TreatmentItemsMedicareNumber)) AS TreatmentItemsMedicareNumber, 
    			  LTRIM(RTRIM(BT_TreatmentItemsTable.TreatmentItemName)) AS TreatmentItemName, 
    			  LTRIM(RTRIM(BT_TreatmentItemsTable.MemberPrice)) AS MemberPrice, 
    			  LTRIM(RTRIM(BT_MembeFavorablePolicyTable.FreeTime)) AS FreeTime, 
    			  LTRIM(RTRIM(BT_MembeFavorablePolicyTable.Remarks)) AS Remarks, 
    			  LTRIM(RTRIM(BT_MembeFavorablePolicyTable.MemberCategoryID)) AS MemberCategoryID, 
    			  BT_MembeFavorablePolicyTable.WhetherEffective
    		FROM         BT_MembeFavorablePolicyTable INNER JOIN
    			  BT_MemberCategoryTable ON BT_MembeFavorablePolicyTable.MemberCategoryID = BT_MemberCategoryTable.MemberCategoryID INNER JOIN
    			  BT_TreatmentItemsTable ON BT_MembeFavorablePolicyTable.TreatmentItemID = BT_TreatmentItemsTable.TreatmentItemID	    
    	END
    

    2)、逻辑层代码:

    [OperationContract]
            #region 查询优惠政策
            public DataSet FRM_HuiYuanZhengCheYouHuiSheZhi_Load_SelectMembeFavorablePolicy()
            {
                SqlParameter[] SQLCMDpas ={
                                              new  SqlParameter ("@Type",SqlDbType.Char),
                                                  };
                SQLCMDpas[0].Value = "FRM_HuiYuanZhengCheYouHuiSheZhi_Load_SelectMembeFavorablePolicy";
                DataTable myDataTable = myDALMethod.QueryDataTable("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas);
                DataSet myDataSet = new DataSet();
                myDataSet.Tables.Add(myDataTable);
                return myDataSet;
            }
            #endregion
    

    3)、界面层代码:

    #region Load事件
            private void FRM_HuiYuanZhengCheYouHuiSheZhi_Load(object sender, EventArgs e)
            {            
                dgvMembeFavorablePolicy.DataSource = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.FRM_HuiYuanZhengCheYouHuiSheZhi_Load_SelectMembeFavorablePolicy().Tables[0];//查询绑定会员政策优惠设置信息
                dgvMembeFavorablePolicy.ClearSelection();//清空默认选行
            }
            #endregion
    

    删除会员政策优惠设置

    1)、存储过程代码:

    --删除会员政策优惠设置
    IF(@Type ='btnShanChu_Click_DeleteMembeFavorablePolicy')
    	BEGIN
    		DELETE BT_MembeFavorablePolicyTable
    		WHERE  BT_MembeFavorablePolicyTable.MembeFavorablePolicyID =@MembeFavorablePolicyID	
    	END
    

    2)、逻辑层代码:

    [OperationContract]
            #region 删除优惠政策
            public int btnShanChu_Click_DeleteMembeFavorablePolicy(int intMembeFavorablePolicyID)
            {
                SqlParameter[] SQLCMDpas ={new SqlParameter("@type",SqlDbType.Char),
                                new SqlParameter("@MembeFavorablePolicyID",SqlDbType.Int),};
    
                SQLCMDpas[0].Value = "btnShanChu_Click_DeleteMembeFavorablePolicy";
                SQLCMDpas[1].Value = intMembeFavorablePolicyID;
                int count = myDALMethod.UpdateData("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas);
                return count;
            }
            #endregion
    

    3)、界面层代码:

    #region 删除事件
            private void btnShanChu_Click(object sender, EventArgs e)
            {
                DialogResult dr = MessageBox.Show("是否删除?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);//弹出确定对话框
                if (dr == DialogResult.OK)//如果点了确定按钮
                {
                    MembeFavorablePolicyID = Convert.ToInt32(dgvMembeFavorablePolicy.CurrentRow.Cells["会员优惠政策ID"].Value);//获取点击行的会员优惠政策ID赋值给MembeFavorablePolicyID
                    if (MembeFavorablePolicyID != 0)//当MembeFavorablePolicyID不为0时
                    {
                        myFRM_HuiYuanZhengCheYouHuiSheZhiClient.btnShanChu_Click_DeleteMembeFavorablePolicy(MembeFavorablePolicyID);//执行删除会员优惠政策
                        dgvMembeFavorablePolicy.DataSource = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.FRM_HuiYuanZhengCheYouHuiSheZhi_Load_SelectMembeFavorablePolicy().Tables[0];//刷新界面                   
    
                    }
                    else
                    {
                        MessageBox.Show("请选择要删除的行。。");
                    }
                }
            }
            #endregion
    

    3.5.3.2新增会员政策优惠设置

    点击项目编号后的文本框里面的加号按钮可以弹出优惠项目的界面,选择优惠项目输入免费次数和政策备注点击保存,一条优惠政策生成。

    新增会员政策优惠设置截图:

     

    3.5.3.2(图1

    新增会员政策优惠设置

    1)、存储过程代码:

     

    --查询项目
    IF(@Type='btnTanChuXingMu_Click_SelectTreatmentItem')	
    	BEGIN
    		SELECT     LTRIM (RTRIM(TreatmentItemID))AS TreatmentItemID, 
    					LTRIM (RTRIM(TreatmentItemName))AS TreatmentItemName, 
    					LTRIM (RTRIM(TreatmentItemsMedicareNumber))AS TreatmentItemsMedicareNumber, 
    					LTRIM (RTRIM(MemberPrice))AS MemberPrice
    		FROM       BT_TreatmentItemsTable
    	END
    --查询会员类型
    IF(@Type ='FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load_SelectMemberCategory')
    	BEGIN
    		SELECT    LTRIM (RTRIM( MemberCategoryID)) AS MemberCategoryID, 
    		          LTRIM (RTRIM( MemberCategoryName)) AS MemberCategoryName
    		FROM       BT_MemberCategoryTable
    	END
    --新增会员政策优惠
    IF(@Type='btnBaoCun_Click_InsertMembeFavorablePolicy')
    	BEGIN
    	BEGIN TRAN
    		INSERT     BT_MembeFavorablePolicyTable(MemberCategoryID, TreatmentItemID, FreeTime, Remarks)         
    		VALUES    (@MemberCategoryID, @TreatmentItemID, @FreeTime, @Remarks)  
    	COMMIT TRAN
    	SELECT @@IDENTITY 
    	END
    

    2)、逻辑层代码:

    [OperationContract]
            #region 查询治疗项目
            public DataSet btnTanChuXingMu_Click_SelectTreatmentItem()
            {
                SqlParameter[] SQLCMDpas ={
                                              new  SqlParameter ("@Type",SqlDbType.Char),
                                                  };
                SQLCMDpas[0].Value = "btnTanChuXingMu_Click_SelectTreatmentItem";
                DataTable myDataTable = myDALMethod.QueryDataTable("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas);
                DataSet myDataSet = new DataSet();
                myDataSet.Tables.Add(myDataTable);
                return myDataSet;
            }
            #endregion
            [OperationContract]
            #region 查询会员类型
            public DataSet FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load_SelectMemberCategory()
            {
                SqlParameter[] SQLCMDpas ={
                                              new  SqlParameter ("@Type",SqlDbType.Char),
                                                  };
                SQLCMDpas[0].Value = "FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load_SelectMemberCategory";
                DataTable myDataTable = myDALMethod.QueryDataTable("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas);
                DataSet myDataSet = new DataSet();
                myDataSet.Tables.Add(myDataTable);
                return myDataSet;
            }
            #endregion
            [OperationContract]
            #region 新增优惠政策
            public int btnBaoCun_Click_InsertMembeFavorablePolicy(int intMemberCategoryID, int intTreatmentItemID, string strFreeTime, string strRemarks)
            {
                SqlParameter[] SQLCMDpas ={
                                              new  SqlParameter ("@Type",SqlDbType.Char),
                                              new  SqlParameter ("@MemberCategoryID",SqlDbType.Int),
                                              new  SqlParameter ("@TreatmentItemID",SqlDbType.Int),
                                              new  SqlParameter ("@FreeTime",SqlDbType.Char),
                                              new  SqlParameter ("@Remarks",SqlDbType.Char),
                                                  };
                SQLCMDpas[0].Value = "btnBaoCun_Click_InsertMembeFavorablePolicy";
                SQLCMDpas[1].Value = intMemberCategoryID;
                SQLCMDpas[2].Value = intTreatmentItemID;
                SQLCMDpas[3].Value = strFreeTime;
                SQLCMDpas[4].Value = strRemarks;
                int count = myDALMethod.UpdateData("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas);
                return count;
            }
            #endregion
            [OperationContract]
    
    

    3)、界面层代码:

    #region 声明全局变量
            BLL医院管理系统.HuiYuanGuanLi.FRM_HuiYuanZhengCheYouHuiSheZhi.FRM_HuiYuanZhengCheYouHuiSheZhiClient myFRM_HuiYuanZhengCheYouHuiSheZhiClient
                = new BLL医院管理系统.HuiYuanGuanLi.FRM_HuiYuanZhengCheYouHuiSheZhi.FRM_HuiYuanZhengCheYouHuiSheZhiClient();
            bool A = false;
            #endregion
            #region Load事件
            private void FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load(object sender, EventArgs e)
            {
                dgvItem.Visible = false;//dgvItem治疗项目窗体设为隐藏
                DataTable dtHuiYuanLeiXing = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load_SelectMemberCategory().Tables[0];//查询会员类别数据
                cboMemberCategory = PublicStaticMothd.SetZhiXiaLaKuang(cboMemberCategory, dtHuiYuanLeiXing, "MemberCategoryID", "MemberCategoryName"); //绑定会员类别数据
            }
            #endregion
            #region 弹出项目窗体事件
            private void btnTanChuXingMu_Click(object sender, EventArgs e)
            {
                dgvItem.Visible = true;//dgvItem治疗项目窗体设为可见
               dgvItem.DataSource = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.btnTanChuXingMu_Click_SelectTreatmentItem().Tables[0];//查询绑定治疗项目数据            
               A = true;//开关A为真
            }
            #endregion        
           #region 从dgvXiangMu绑定项目到新增界面
            int ItemID;//声明项目ID
            string ItemNumber;//声明项目编号
            string ItemName;//声明项目ID
            decimal ItemPrice;  //声明项目单价    
            private void dgvXiangMu_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                //从治疗项目窗体获取数据分别赋值给对应的声明的变量
                ItemID = Convert.ToInt32(dgvItem.CurrentRow.Cells["治疗项目ID"].Value);
                ItemNumber = dgvItem.CurrentRow.Cells["治疗项目编号"].Value.ToString();
                ItemName = dgvItem.CurrentRow.Cells["治疗项目名称"].Value.ToString();
                ItemPrice = Convert.ToDecimal(dgvItem.CurrentRow.Cells["治疗项目单价"].Value);
                if (A)
                {
                    //给界面控件赋值
                    int ZhiLiaoXiangMuID = ItemID;
                    txtItemCoding.Text = ItemNumber;
                    txtItemName.Text = ItemName;
                    txtItemPrice.Text = ItemPrice.ToString();
                    A = false;  //开关A为假              
                }
                dgvItem.Visible = false;//治疗项目窗体设置隐藏
            }
            #endregion
    
            #region 保存新增事件
            private void btnBaoCun_Click(object sender, EventArgs e)
            {
                if (cboMemberCategory.SelectedValue.ToString() != "" && ItemID.ToString() != "" && nudFreeTime.Value.ToString() != "" && txtRemarks.Text != "")//判断控件数据不为空
                {
                    int intMemberCategoryID = Convert.ToInt32(cboMemberCategory.SelectedValue);//给声明的变量会员类别ID intMemberCategoryID赋值
                    int intTreatmentItemID = ItemID;//给声明的变量治疗项目ID intTreatmentItemID赋值
                    string strFreeTime = nudFreeTime.Value.ToString().Trim();//给声明的变量免费次数 strFreeTime赋值
                    string strRemarks = txtRemarks.Text.ToString().Trim();//给声明的变量政策备注 strRemarks赋值                
                    int count = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.btnBaoCun_Click_InsertMembeFavorablePolicy(intMemberCategoryID, intTreatmentItemID, strFreeTime, strRemarks);//执行新增优惠政策设置
                    if (count > 0)
                    {
                        MessageBox.Show("新增优惠政策成功!");
                        this.Close();//关闭当前窗体
                    }
                    else
                    {
                        MessageBox.Show("新增优惠政策失败!");
                    }
                }
                else
                {
                    MessageBox.Show("数据没有填写完整,请继续!");
                }
            }
            #endregion
    

    3.5.3.3修改会员政策优惠设置

    这里可以对会员政策进行修改,如改变免费次数或选择新的免费项目等。

    修改会员政策优惠设置截图:

     

    3.5.3.3(图1

    修改会员政策优惠设置

    1)、存储过程代码:

    --修改会员政策优惠设置
    IF(@Type ='btnBaoCun_Click_UpdateMembeFavorablePolicy')	
    	BEGIN
    		UPDATE   BT_MembeFavorablePolicyTable
    		SET     MemberCategoryID=@MemberCategoryID, TreatmentItemID=@TreatmentItemID, 
    		        FreeTime=@FreeTime, Remarks=@Remarks
    		WHERE    BT_MembeFavorablePolicyTable.MembeFavorablePolicyID =@MembeFavorablePolicyID
    	END
    

    2)、逻辑层代码:

    [OperationContract]
            #region 修改优惠政策
            public bool btnBaoCun_Click_UpdateMembeFavorablePolicy(int intMemberCategoryID, int intTreatmentItemID, string strFreeTime, string strRemarks, int intMembeFavorablePolicyID)
            {
                SqlParameter[] SQLCMDpas ={
                                              new  SqlParameter ("@Type",SqlDbType.Char),
                                              new  SqlParameter ("@MemberCategoryID",SqlDbType.Int),
                                              new  SqlParameter ("@TreatmentItemID",SqlDbType.Int),
                                              new  SqlParameter ("@FreeTime",SqlDbType.Char),
                                              new  SqlParameter ("@Remarks",SqlDbType.Char),
                                              new  SqlParameter ("@MembeFavorablePolicyID",SqlDbType.Int),
                                                  };
                SQLCMDpas[0].Value = "btnBaoCun_Click_UpdateMembeFavorablePolicy";
                SQLCMDpas[1].Value = intMemberCategoryID;
                SQLCMDpas[2].Value = intTreatmentItemID;
                SQLCMDpas[3].Value = strFreeTime;
                SQLCMDpas[4].Value = strRemarks;
                SQLCMDpas[5].Value = intMembeFavorablePolicyID;
                if (myDALMethod.UpdateData("HuiYuanGuanLi_FRM_HuiYuanZhengCheYouHuiSheZhi", SQLCMDpas) > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            #endregion
    

     

    (3)、界面层代码:

    #region 声明全局变量
            BLL医院管理系统.HuiYuanGuanLi.FRM_HuiYuanZhengCheYouHuiSheZhi.FRM_HuiYuanZhengCheYouHuiSheZhiClient myFRM_HuiYuanZhengCheYouHuiSheZhiClient
                = new BLL医院管理系统.HuiYuanGuanLi.FRM_HuiYuanZhengCheYouHuiSheZhi.FRM_HuiYuanZhengCheYouHuiSheZhiClient();
            bool A = false;//声明一个开关A
            #endregion
            #region Load事件
            private void FRM_HuiYuanZhengCheYouHuiSheZhi_Update_Load(object sender, EventArgs e)
            {
                dgvItem.Visible = false;//dgvItem治疗项目窗体设为隐藏
                DataTable dtHuiYuanLeiXing = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.FRM_HuiYuanZhengCheYouHuiSheZhi_Insert_Load_SelectMemberCategory().Tables[0];//查询会员类别数据
                cboMemberCategory = PublicStaticMothd.SetZhiXiaLaKuang(cboMemberCategory, dtHuiYuanLeiXing, "MemberCategoryID", "MemberCategoryName");//绑定会员类别数据
                //从会员政策优惠的主界面传值并把传数据绑定到界面控件中
                cboMemberCategory.SelectedValue = Convert.ToInt32(DGVR.Cells["会员类别ID"].Value);
                txtItemCoding.Text = DGVR.Cells["项目编号"].Value.ToString();
                txtXiangMuMingCheng.Text = DGVR.Cells["项目名称"].Value.ToString();
                txtItemPrice.Text = DGVR.Cells["项目单价"].Value.ToString();
                txtRemarks.Text = DGVR.Cells["政策备注"].Value.ToString();
                nudFreeTime.Value = Convert.ToDecimal(DGVR.Cells["免费次数"].Value.ToString());
                if (Convert.ToInt32(DGVR.Cells["有效否"].Value) == 1)
                {
                    chkWhetherEffective.Checked = true;
                }
                else
                {
                    chkWhetherEffective.Checked = false;
                }
                
            }
            #endregion
            #region 弹出治疗项目窗体事件
            private void btnTanChuXingMu_Click(object sender, EventArgs e)
            {
                dgvItem.Visible = true;//dgvItem治疗项目窗体设为可见
                dgvItem.DataSource = myFRM_HuiYuanZhengCheYouHuiSheZhiClient.btnTanChuXingMu_Click_SelectTreatmentItem().Tables[0];//查询绑定治疗项目数据            
                A = true;//开关A为真
            }
            #endregion
            #region 从dgvXiangMu绑定项目到新增界面
            int ItemID;//声明项目ID
            string ItemNumber;//声明项目编号
            string ItemName;//声明项目ID
            decimal ItemPrice;  //声明项目单价    
            private void dgvXiangMu_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                //从治疗项目窗体获取数据分别赋值给对应的声明的变量
                ItemID = Convert.ToInt32(dgvItem.CurrentRow.Cells["治疗项目ID"].Value);
                ItemNumber = dgvItem.CurrentRow.Cells["项目编号"].Value.ToString();
                ItemName = dgvItem.CurrentRow.Cells["治疗项目名称"].Value.ToString();
                ItemPrice = Convert.ToDecimal(dgvItem.CurrentRow.Cells["项目单价"].Value);
                if (A)//如果开关A为真
                {
                    //把对应的声明的变量的数据赋值给界面控件
                    int ZhiLiaoXiangMuID = ItemID;
                    txtItemCoding.Text = ItemNumber;
                    txtXiangMuMingCheng.Text = ItemName;
                    txtItemPrice.Text = ItemPrice.ToString();
                    A = false;//令开关A为假
                }
                dgvItem.Visible = false;//治疗项目窗体设置隐藏
            }
            #endregion        
            #region 保存修改会员优惠政策事件
            private void btnBaoCun_Click(object sender, EventArgs e)
            {
                if (cboMemberCategory.SelectedValue.ToString() != "" && ItemID.ToString() != "" && nudFreeTime.Value.ToString() != "" && txtRemarks.Text != "")//判断控件数据不为空
                {
                    int intMemberCategoryID = Convert.ToInt32(cboMemberCategory.SelectedValue);//给声明的变量会员类别ID intMemberCategoryID赋值
                    int intTreatmentItemID = ItemID;//给声明的变量治疗项目ID intTreatmentItemID赋值
                    string strFreeTime = nudFreeTime.Value.ToString().Trim();//给声明的变量免费次数 strFreeTime赋值
                    string strRemarks = txtRemarks.Text.ToString().Trim();//给声明的变量政策备注 strRemarks赋值
                    int intMembeFavorablePolicyID = Convert.ToInt32(DGVR.Cells["会员优惠政策ID"].Value);
                    if (myFRM_HuiYuanZhengCheYouHuiSheZhiClient.btnBaoCun_Click_UpdateMembeFavorablePolicy(intMemberCategoryID, intTreatmentItemID, strFreeTime, strRemarks, intMembeFavorablePolicyID))//判断执行修改优惠政策设置
                    {
                        MessageBox.Show("修改会员优惠政策成功!");
                    }
                    else
                    {
                        MessageBox.Show("修改会员优惠政策失败!");
                    }
                }
                else
                {
                    MessageBox.Show("请查看是否存在空数据!");
                }
                
    
                this.Close();  
               
            }
            #endregion
    

    仅供学习,禁止用于商业用途。

     

    凡真心尝试助人者,没有不帮到自己的。

     

    古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼

     

    失败是学习过程中必经的阶段,你若未曾失败过,只能说明你承受的还不够。

     

     


     

     




     

     


    展开全文
  • 关注「实验楼」,每天分享一个项目教程 在...正文共:2287 字 预计阅读时间:6 分钟我们激动的宣布将MonkeyType项目开源,通过可见类型的实时追踪,MonkeyType能够为python3代码自动添加类型注解。动机在Inst
  • 评测指标采用AUC,先对每个优惠券单独计算核销预测的AUC值,再对所有优惠券的AUC值求平均作为最终的评价标准。 大赛地址 解决方案概述 本赛题提供了用户线下消费和优惠券领取核销行为的纪录表,用户线上点击/消费和...
  • 天池大赛o2o优惠券第一名代码解读(1)

    万次阅读 多人点赞 2017-07-23 16:19:30
    #将数据转换为str类型 t2.date_received = t2.date_received.astype( 'str' ) #如果出现相同的用户接收相同的优惠券在接收时间上用‘:’连接上第n次接受优惠券的时间 t2 = t2.groupby([ 'user_id' , 'coupon_id'...
  • 3.只是简单对日期和优惠券特征进行了简单的处理。 4.代码中使用逻辑回归进行分类 二、python源码 # -*- coding: utf-8 -*- """Created on Tue Sep 18 10:13:08 2018 @author: H...
  • } } 以上是四种不同类型优惠券计算折扣金额的策略方式,可以从代码中看到每一种优惠方式的优惠金额。 2.3 策略控制类 public class Context<T> { private ICouponDiscount<T> couponDiscount; public Context...
  • #转换数据类型为int t2.replace(- 1 ,np.nan,inplace= True ) #得到使用优惠券购买商品的用户离店铺的最短距离 t3 = t2.groupby( 'user_id' ).agg( 'min' ).reset_index() t3.rename(columns={ 'distance' : '...
  • 弄了2天,发现还是对python不够熟悉,完全不能实现我的各种设想,所以,还是先参考别人的代码,先明白别人的思路和python的写法再说吧。 源代码地址请直接在CSDN上搜索,原文说未经许可不得转载,所以我也不放地址...
  • 决策树:使用决策树预测隐形眼镜类型、天池O2O优惠卷使用预测
  • scrm电商后台管理、公司管理、店铺管理、特卖活动、营销活动、订单管理、优惠券管理、商品管理、会员管理、标签管理、会员卡、签到配置、积分、拼团、砍价、快递配置、短信配置、充值、运营活动、电商后台、html、...
  • 超市周年庆举行购物满减活动,编写Java程序,根据用户输入的会员类型以及购物金额,判断是否能够享受活动优惠,会员类型的输入不限制大小写。具体获取规则:若为VIP会员,则直接享受活动优惠;若为普通会员,则购物...
  • #这个优惠券最近接受时间这里报错了float与str#上面加二句#将数据转换为int类型 t3['this_month_user_receive_same_coupon_lastone'] = t3.max_date_received - t3.date_received.astype(int) #这个优惠券最远接受...
  • 租赁的 一个小型网络应用程序,用于按通勤时间和交通类型抓取和分类伦敦租金优惠
  • Android 代码规范

    千次阅读 2016-08-10 00:45:03
    Android 开发代码规范
  • 1. Duplicated Code(重复的代码)重复的代码分三种类型: - 位于同一个类:提炼成新方法进行调用 - 位于不同的子类:提炼成方法放进父类 - 位于完全不相干的类:提炼出一个新的类,将重复代码放进新的类中...
  • 电商优惠券,优惠码的生成

    千次阅读 2017-02-28 13:55:01
    每一个电子商务网站,现在有一种或多种类型优惠/折扣/优惠券系统,给大家分享一下如何在PHP生成唯一的促销/折扣码。主要是实现一个优惠码系统,可用于跟踪用户来自某些特定的来源,例如有些主机促销的时候链接到别...
  • Java 优惠券最优使用实现

    万次阅读 2018-02-01 16:55:06
    业务需求:用户可以用优惠券在支付相关费用时减免优惠券对应的金额,优惠券分为三种类型:现金券,代金券,折扣券,需要根据用户的优惠券列表,找出优惠券金额最多的使用方案。 优惠券使用说明:所有优惠券都是分...
  • php优惠券核销

    2020-09-28 20:39:44
    建立优惠类型表,里面字段有: 优惠类型Id、 优惠券名称、发放面额、发放数量、核销码集合、满多少元使用 0代表无限制、使用范围0部分产品使用 1全场产品使用、 有效日期开始时间、有效日期结束时间、 创建时间、...
  • 本篇文章讲的是自定义View之边缘凹凸的优惠券效果,之前有见过很多优惠券的效果都是使用了边缘凹凸的样式,碰巧也看到这么一篇文章:http://blog.csdn.net/yissan/article/details/51429281,感谢^_^!和往常一样,...
  • ACF 优惠券字段类型提供了一个方便的只读字段,其中包含根据用户设置自动生成的优惠代码。 描述 要使用插件,您需要有 ACF 插件。 只需打开这个插件设置,创建一个新的字段集并在字段类型下拉列表中选择优惠券项目...
  • 以下是最近实现的优惠券活动,主要的业务需求:根据后端设置优惠券模板,用户类型设置,优惠券活动的开始与结束时间,最后生成不同的优惠券活动链接。 代码环境: 源码主要laravel5.8,一整个活动要贴的代码很多,...
  • JavaScript 中, 5 种增加代码可读性的最佳实践

    千次阅读 多人点赞 2019-11-27 07:30:00
    如果咱们关注代码本身结构及可读笥,而不是只关心它是否能工作,那么咱们写代码是有一定的水准。专业开发人员将为未来的自己和“其他人”编写代码,而不仅仅只编写能应付当前工作的代码。 在此基础上,可读性高的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,250
精华内容 6,900
关键字:

优惠类型代码